爬虫-Scrapy(八)Scrapy快读提取超链接

前面写过用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),)

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

 

posted @ 2021-01-14 00:30  荆棘谷三季稻  阅读(213)  评论(0)    收藏  举报