ホームページ  >  記事  >  バックエンド開発  >  Python Scrapy クローラー: 同期および非同期ページングのデモ

Python Scrapy クローラー: 同期および非同期ページングのデモ

高洛峰
高洛峰オリジナル
2016-11-22 14:03:263634ブラウズ

ページングのインタラクションには、データをリクエストするときの同期と非同期の 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 形式のファイルが生成されます:

Python Scrapy クローラー: 同期および非同期ページングのデモ

非同期ページング

非同期ページング中、ページは部分的に更新されますが、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 &#39;next page-------&#39;
                    self.page=self.page+1
                    url= self.pre_url+str(self.page*20)                    yield scrapy.Request(url,headers={&#39;User-Agent&#39;:self.user_agent},callback=self.parse)

クローラーを開始します:scrapy runspider //spiders//test_spider.py -o test .json が完了すると、json 形式のファイルが生成されます:

Python Scrapy クローラー: 同期および非同期ページングのデモ

Scrapy と BeautifulSoup または lxml の違い

Scrapy はクローラーとデータをクローリングするための完全なフレームワークですが、BeautifulSoup または lxml は HTML/XML を解析するための単なるライブラリであり、scrapy の xpath セレクターや css セレクターと同様の関数を備えており、scrapy でも使用できますが、操作効率は比較的高くなります。低い。 Scrapy のセレクターを使用する場合、ブラウザーの F12 モードを使用して、任意のノードの xpath および css 値を直接コピーできます。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。