前面写过用xpath 方式定位response对象中我们所需要的超链接地址,但如果超链接过多且位置规律性差就不太方便了,现在介绍一种快速提取和过滤超链接地址的方法
1.明确需求
查看豆瓣图书中首页中所有图书的超链接,先看首页长这样的
然后随便点击一本数,进入图书的详情页,是这样的
此时我们查看下浏览器的url地址,是https://book.douban.com/subject/35166573/?icn=index-latestbook-subject,这个就是我们要抓取的地址。
2. 创建爬虫
可以用scrapy genspider命令创建爬虫,创建后修改类的参数,将自动生成的继承 scrapy.Spider 改为 CrawlSpider,这样用自定义的方法接收request请求
from scrapy.spiders import CrawlSpider class BookSubjectSpider(CrawlSpider): name = ‘BookSpider‘ allowed_domains = [‘book.douban.com‘] start_urls = [‘https://book.douban.com/‘]
3.引入LinkExtractor 和 Rule
LinkExtractor 链接下载器,支持用正则表达式来过滤允许或者排除的url,Rule方法则是定义抓取到url后的回调方法、url过滤规则,是否循环等。
先写一个不过滤的写法
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),)
再次运行看结果,没问题了
标签:shangdixinxi 上地信息