前面寫過用xpath 方式定位response對象中咱們所須要的超連接地址,但若是超連接過多且位置規律性差就不太方便了,如今介紹一種快速提取和過濾超連接地址的方法正則表達式
1.明確需求瀏覽器
查看豆瓣圖書中首頁中全部圖書的超連接,先看首頁長這樣的
dom
而後隨便點擊一本數,進入圖書的詳情頁,是這樣的scrapy
此時咱們查看下瀏覽器的url地址,是https://book.douban.com/subject/35166573/?icn=index-latestbook-subject,這個就是咱們要抓取的地址。ide
2. 建立爬蟲url
能夠用scrapy genspider命令建立爬蟲,建立後修改類的參數,將自動生成的繼承 scrapy.Spider 改成 CrawlSpider,這樣用自定義的方法接收request請求spa
from scrapy.spiders import CrawlSpider class BookSubjectSpider(CrawlSpider): name = 'BookSpider' allowed_domains = ['book.douban.com'] start_urls = ['https://book.douban.com/']
3.引入LinkExtractor 和 Rulecode
LinkExtractor 連接下載器,支持用正則表達式來過濾容許或者排除的url,Rule方法則是定義抓取到url後的回調方法、url過濾規則,是否循環等。對象
先寫一個不過濾的寫法blog
from scrapy.spiders import CrawlSpider,Rule from scrapy.linkextractors import LinkExtractor class BookSubjectSpider(CrawlSpider): name = 'BookSpider' allowed_domains = ['book.douban.com'] start_urls = ['https://book.douban.com/'] rules = (Rule( callback='parse_item', follow=True),) def parse_item(self, response): print(response.url)
看下結果
注意這裏出現非圖書詳情頁的url,圖書詳情頁url應該是 https://book.douban.com/subject/數字編號/其餘字符.
這時候須要LinkExtractor,改下這部分代碼
rules = (Rule( LinkExtractor(allow=('https://book.douban.com/subject/(\\d)+/$')), callback='parse_item', follow=True),)
再次運行看結果,沒問題了