爬蟲-Scrapy(八)Scrapy快讀提取超連接

前面寫過用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),)

再次運行看結果,沒問題了

相關文章
相關標籤/搜索