前面写过用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),)
再次运行看结果,没问题了