Python Scrapy爬蟲:同步和非同步分頁的DEMO

來源:互聯網
上載者:User
分頁互動在請求資料時有同步和非同步兩種情況,同步時頁面整體重新整理,非同步時頁面局部重新整理。對於這兩種分頁的資料在進行爬蟲時,處理的方式是不一樣的。 DEMO僅供學習,網域名稱全部匿為test

同步分頁

同步分頁時,頁面整體重新整理,url地址欄會發生變化

爬蟲解析的資料對象是html

測試情境:抓取某招聘網站北京區的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

#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 or lxml的區別

scrapy是編寫爬蟲和抓取資料的一整套架構,而BeautifulSoup or lxml只是解析html/xml的庫,功能就像scrapy的xpath和css選取器,所以它們也可以在scrapy下使用,只是運行效率相對較低。 在使用scrapy的選取器時,我們可以藉助瀏覽器的F12模式,直接Copy任意節點的xpath和css值。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.