日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scrapy发送翻页请求

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy发送翻页请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.翻頁請求的思路

對于要提取如下圖中所有頁面上的數據該怎么辦?

回顧requests模塊是如何實現翻頁請求的:

  • 找到下一頁的URL地址
  • 調用requests.get(url)
  • scrapy實現翻頁的思路:

  • 找到下一頁的url地址
  • 構造url地址的請求,傳遞給引擎
  • 2.scrapy實現翻頁請求

    2.1 實現方法

  • 確定url地址
  • 構造請求,scrapy.Request(url,callback)
    callback:指定解析函數名稱,表示該請求返回的響應使用哪一個函數進行解析
  • 把請求交給引擎:yield scrapy.Request(url,callback)
  • 2.2 騰訊招聘爬蟲
    通過爬取騰訊招聘的頁面的招聘信息,學習如何實現翻頁請求

    地址:http://hr.tencent.com/position.php

    思路分析:

  • 獲取首頁的數據
  • 尋找下一頁的地址,進行翻頁,獲取數據
  • 注意

    1.可以在settings中設置ROBOTS協議

    # False表示忽略網站的robots.txt協議,默認為True ROBOTSTXT_OBEY = False

    2.可以在settings中設置User-Agent:

    # scrapy發送的每一個請求的默認UA都是設置的這個User-Agent USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTM

    2.3 代碼實現

    在爬蟲文件的parse方法中:

    # 提取下一頁的href并拼接url next_url = 'https://hr.tencent.com/' + response.xpath('//a[text()="下一頁"]/@href').extract_first() # 判斷是否是最后一頁 if response.xpath('//a[text()="下一頁"]/@href').extract_first() != 'javascript:;':# 構造scrapy.Request對象,并yield給引擎# 利用callback參數指定該Request對象之后獲取的響應用哪個函數進行解析# 利用meta參數將本函數中提取的數據傳遞給callback指定的函數# 注意這里是yieldyield scrapy.Request(next_url, callback=self.parse)

    2.4 scrapy.Request的更多參數

    scrapy.Request(url[,callback,method="GET",headers,body,cookies,\ meta,dont_filter=False])

    參數解釋

  • 中括號中的參數為可選參數
  • callback:表示當前的url的響應交給哪個函數去處理
  • meta:實現數據在不同的解析函數中傳遞,meta默認帶有部分數據,比如下載延遲,請求深度等
  • dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續被請求,對需要重復請求的url地址可以把它設置為Ture,比如貼吧的翻頁請求,頁面的數據總是在變化;start_urls中的地址會被反復請求,否則程序不會啟動
  • method:指定POST或GET請求
  • headers:接收一個字典,其中不包括cookies
  • cookies:接收一個字典,專門放置cookies
  • body:接收一個字典,為POST的數據
  • 3.meta參數的使用

    meta的形式:字典
    meta的作用:meta可以實現數據在不同的解析函數中的傳遞參數

    在爬蟲文件的parse方法中,提取詳情頁增加之前

    def parse(self,response):...yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item}) ...def parse_detail(self,response):#獲取之前傳入的itemitem = resposne.meta["item"]

    特別注意:

    1.meta參數是一個字典
    2.meta字典中有一個固定的鍵proxy,表示代理ip,關于代理ip的使用我們將在scrapy的下載中間件的學習中進行介紹

    4. item的使用

    4.1 Item能夠做什么

    定義item即提前規劃好哪些字段需要抓取,scrapy.Field()僅僅是提前占坑,通過item.py能夠讓別人清楚自己的爬蟲是在抓取什么,同時定義好哪些字段是需要抓取的,沒有定義的字段不能使用,防止手誤

    在python大多數框架中,大多數框架都會自定義自己的數據類型(在python自帶的數據結構基礎上進行封裝),目的是增加功能,增加自定義異常

    4.2 定義Item

    在items.py文件中定義要提取的字段:

    class TencentItem(scrapy.Item): name = scrapy.Field() # 招聘標題address = scrapy.Field() # 工作地址time = scrapy.Field() # 發布時間job_content = scrapy.Field() # 工作職責

    4.3 使用Item

    Item使用之前需要先導入并且實例化,之后的使用方法和使用字典相同
    修改爬蟲文件itcast.py:

    from Tencent.items import TencentItem # 導入Item,注意路徑 ...def parse_detail(self, response):meta_dict = response.meta # 獲取傳入的metaitem = TencentItem() # 實例化后可直接使用item['name'] = meta_dict['name']item['address'] = meta_dict['address']item['time'] = meta_dict['time']# 加入崗位職責數據item['job_content'] = response.xpath('//ul[@class="squareli"]/li/text()').extract() print(item)

    注意:

  • from myspider.items import ItcastItem這一行代碼中 注意item的正確導入路徑,忽略pycharm標記的錯誤
  • python中的導入路徑要訣:從哪里開始運行,就從哪里開始導入
  • 總結

  • 完善并使用Item數據類:
    1.1 在items.py中完善要爬取的字段
    1.2 在爬蟲文件中先導入Item
    1.3 實力化Item對象后,像字典一樣直接使用
  • 構造Request對象,并發送請求:
    2.1 導入scrapy.Request類
    2.2 在解析函數中提取url
    2.3 yield scrapy.Request(url, callback=self.parse_detail, meta={})
  • 利用meta參數在不同的解析函數中傳遞數據:
    3.1 通過前一個解析函數 yield scrapy.Request(url, callback=self.xxx, meta={}) 來傳遞meta
    3.2 在self.xxx函數中 response.meta.get(‘key’, ‘’) 或 response.meta[‘key’] 的方式取出傳遞的數據
  • 參考代碼

    Tencent/spiders/tencent.py

    import scrapy from Tencent.items import TencentItem # 導入Item,注意路徑class TencentSpider(scrapy.Spider):name = 'tencent'allowed_domains = ['hr.tencent.com']start_urls = ['http://hr.tencent.com/position.php']def parse(self, response):tr_list = response.xpath('//*[@class="tablelist"]//tr')[1:-1]for tr in tr_list:meta_dict = {}meta_dict['name'] = tr.xpath('.//a[1]/text()').extract_first()meta_dict['address'] = tr.xpath('./td[4]/text()').extract_first()meta_dict['time'] = tr.xpath('./td[5]/text()').extract_first()meta_dict['href'] = tr.xpath('.//a[1]/@href').extract_first()detail_url = 'https://hr.tencent.com/' + meta_dict['href']yield scrapy.Request(detail_url, callback=self.parse_detail, meta=meta_dict)# 提取下一頁的href并拼接urlnext_url = 'https://hr.tencent.com/' + response.xpath('//a[text()="下一頁"]/@href').extract_first()# 判斷是否是最后一頁if response.xpath('//a[text()="下一頁"]/@href').extract_first() != 'javascript:;':# 構造scrapy.Request對象,并yield給引擎# 利用callback參數指定該Request對象之后獲取的響應用哪個函數進行解析# 利用meta參數將本函數中提取的數據傳遞給callback指定的函數# 注意這里是yieldyield scrapy.Request(next_url, callback=self.parse)def parse_detail(self,response):meta_dict = response.meta # 獲取傳入的metaitem = TencentItem() # 實例化后可直接使用item['name'] = meta_dict['name']item['address'] = meta_dict['address']item['time'] = meta_dict['time']# 加入崗位職責數據item['job_content'] = response.xpath('//ul[@class="squareli"]/li/text()').extract()print(item)

    Tencent/items.py

    import scrapyclass TencentItem(scrapy.Item):name = scrapy.Field() # 招聘標題address = scrapy.Field() # 工作地址time = scrapy.Field() # 發布時間job_content = scrapy.Field() # 工作職責

    Tencent/settings.py

    USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'ROBOTSTXT_OBEY = False

    總結

    以上是生活随笔為你收集整理的scrapy发送翻页请求的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。