ページングのインタラクションには、データをリクエストするときの同期と非同期の 2 つの状況があります。同期の場合はページ全体が更新され、非同期の場合はページが部分的に更新されます。 2 種類のページ分割されたデータは、クロール時に異なる方法で処理されます。デモは学習のみを目的としており、すべてのドメイン名はテストとして匿名化されています
同期ページング
同期ページング中は、ページ全体が更新され、URL アドレスバーが変更されます
クローラーによって解析されるデータ オブジェクトは HTML です
テストシナリオ: 北京の求人 Web サイトをクロールする 地区の Java 求人
#coding=utf-8import scrapyclass TestSpider(scrapy.Spider): name='test' download_delay=3 user_agent='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36' page_url = 'http://www.test.com/zhaopin/Java/{0}/?filterOption=2' page=1 #执行入口 def start_requests(self): #第一页 yield scrapy.Request(self.page_url.format('1'), headers={'User-Agent':self.user_agent}, callback=self.parse, errback=self.errback_httpbin) #解析返回的数据 def parse(self,response): for li in response.xpath('//*[@id="s_position_list"]/ul/li'): yield{ 'company':li.xpath('@data-company').extract(), 'salary':li.xpath('@data-salary').extract() } #是否是最后一页,根据下一页的按钮css样式判断 if response.css('a.page_no.pager_next_disabled'): print('---is the last page,stop!---') pass else: self.page=self.page+1 #抓取下一页 yield scrapy.Request(self.page_url.format(str(self.page)), headers={'User-Agent':self.user_agent}, callback=self.parse, errback=self.errback_httpbin) #异常处理 def errback_httpbin(self,failure): if failure.check(HttpError): response = failure.value.response print 'HttpError on {0}'.format(response.url) elif failure.check(DNSLookupError): request = failure.request print'DNSLookupError on {0}'.format(request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request print'TimeoutError on {0}'.format(request.url)
クローラーを開始します:scrapy runspider //spiders//test_spider.py -o test.csv 完了すると、csv 形式のファイルが生成されます:
非同期ページング
非同期ページング中、ページは部分的に更新されますが、URL アドレス バーは変化しません
クローラーによって解析されるデータ オブジェクトは通常 Json です
テスト シナリオ: 映画のトップ 100 のクラシック映画をクロールしますwebsite
#coding=utf-8import scrapyimport jsonclass TestSpider(scrapy.Spider): name ='test' download_delay = 3 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36' pre_url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85%B8&sort=recommend&page_limit=20&page_start=' page=0 cnt=0 def start_requests(self): url= self.pre_url+str(0*20) yield scrapy.Request(url,headers={'User-Agent':self.user_agent},callback=self.parse) def parse(self,response): if response.body: # json字符串转换成Python对象 python_obj=json.loads(response.body) subjects=python_obj['subjects'] if len(subjects)>0: for sub in subjects: self.cnt=self.cnt+1 yield { 'title':sub["title"], 'rate':sub["rate"] } if self.cnt<100: print 'next page-------' self.page=self.page+1 url= self.pre_url+str(self.page*20) yield scrapy.Request(url,headers={'User-Agent':self.user_agent},callback=self.parse)
クローラーを開始します:scrapy runspider //spiders//test_spider.py -o test .json が完了すると、json 形式のファイルが生成されます:
Scrapy と BeautifulSoup または lxml の違い
Scrapy はクローラーとデータをクローリングするための完全なフレームワークですが、BeautifulSoup または lxml は HTML/XML を解析するための単なるライブラリであり、scrapy の xpath セレクターや css セレクターと同様の関数を備えており、scrapy でも使用できますが、操作効率は比較的高くなります。低い。 Scrapy のセレクターを使用する場合、ブラウザーの F12 モードを使用して、任意のノードの xpath および css 値を直接コピーできます。