爬虫-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),)

再次运行看结果,没问题了

相关文章
相关标签/搜索