1. 程式人生 > >三十三、scrapy的crawlspider爬蟲

三十三、scrapy的crawlspider爬蟲

1.crawlspider是什麼

  回顧之前的程式碼中,我們有很大一部分時間在尋找下一頁的url地址或者是內容的url地址上面,這個過程能更簡單一些麼?

思路:

  • 從response中提取所有的滿足規則的url地址
  • 自動的構造自己requests請求,傳送給引擎

  對應的crawlspider就可以實現上述需求,能夠匹配滿足條件的url地址,組裝成Reuqest物件後自動傳送給引擎,同時能夠指定callback函式,即:crawlspider爬蟲可以按照規則自動獲取連線
  crawlspider的作用:crawlspider可以按照規則自動獲取連線

2.建立crawlspider爬蟲並觀察爬蟲內的預設內容

2.1 建立crawlspider爬蟲:

scrapy genspider -t crawl tencent xxx

2.2 spider中預設生成的內容如下:

class TencentSpider(CrawlSpider):
    name = 'itcast1'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['http://hr.tencent.com']

    rules = (
        Rule(LinkExtractor(
allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): i = {} #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract() #i['name'] = response.xpath('//div[@id="name"]').extract() #i['description'] = response.xpath('//div[@id="description"]').extract()
return i

2.3 觀察跟普通的scrapy.spider的區別

在crawlspider爬蟲中,沒有parse函式

重點在rules中:

  • rules是一個元組或者是列表,包含的是Rule物件
  • Rule表示規則,其中包含LinkExtractor,callback和follow等引數
    LinkExtractor:連線提取器,可以通過正則或者是xpath來進行url地址的匹配
    callback :表示經過連線提取器提取出來的url地址響應的回撥函式,可以沒有,沒有表示響應不會進行回撥函式的處理
    follow:連線提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,True表示會,Flase表示不會

3. crawlspider騰訊招聘爬蟲

通過crawlspider爬取騰訊招聘的詳情頁的招聘資訊

url:http://hr.tencent.com/position.php

思路分析:

  • 定義一個規則,來進行列表頁翻頁,follow需要設定為True
  • 定義一個規則,實現從列表頁進入詳情頁,並且指定回撥函式
  • 在詳情頁提取資料

注意:連線提取器LinkExtractor中的allow對應的正則表示式匹配的是href屬性的值

4.crawlspider使用的注意點:

  • 除了用命令scrapy genspider -t crawl <爬蟲名> <allowed_domail>建立一個crawlspider的模板,還可以手動建立
  • crawlspider中不能再有以parse為名的資料提取方法,該方法被crawlspider用來實現基礎url提取等功能
  • Rule物件中LinkExtractor為固定引數,其他callback、follow為可選引數
    不指定callback且follow為True的情況下,滿足rules中規則的url還會被繼續提取和請求
  • 如果一個被提取的url滿足多個Rule,那麼會從rules中選擇一個滿足匹配條件的Rule執行

5 瞭解crawlspider其他知識點

(1)連結提取器LinkExtractor的更多常見引數

  • allow: 滿足括號中的’re’表示式的url會被提取,如果為空,則全部匹配
  • deny: 滿足括號中的’re’表示式的url不會被提取,優先順序高於allow
  • allow_domains: 會被提取的連結的domains(url範圍),如:[‘hr.tencent.com’, ‘baidu.com’]
  • deny_domains: 不會被提取的連結的domains(url範圍)
  • restrict_xpaths: 使用xpath規則進行匹配,和allow共同過濾url,即xpath滿足的範圍內的url地址會被提取,如:restrict_xpaths=’//div[@class=“pagenav”]’

(2)Rule常見引數

  • LinkExtractor: 連結提取器,可以通過正則或者是xpath來進行url地址的匹配
  • callback: 表示經過連線提取器提取出來的url地址響應的回撥函式,可以沒有,沒有表示響應不會進行回撥函式的處理
  • follow: 連線提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,預設True表示會,Flase表示不會
  • process_links: 當連結提取器LinkExtractor獲取到連結列表的時候呼叫該引數指定的方法,這個自定義方法可以用來過濾url,且這個方法執行後才會執行callback指定的方法

6 參考程式碼

  • crawlspider的作用:crawlspider可以按照規則自動獲取連線
Tencent/spiders/tencent.py

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class TencentSpider(CrawlSpider):
    name = 'tencent'
    allowed_domains = ['hr.tencent.com']
    start_urls = ['https://hr.tencent.com/position.php']

    rules = (
        # 列表頁
        Rule(LinkExtractor(allow=r'position\.php\?&start=\d+#a'), follow=True),
        # 詳情頁
        Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+&keywords=&tid=0&lid=0'), callback='parse_item'),
    )

    def parse_item(self, response):
        i = {}
        # 崗位職責資料
        i['job_content'] = response.xpath('//ul[@class="squareli"]/li/text()').extract()
        print(i)
        return i

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