scrapy进阶(下)(有具体的详细案例和方法)

1.豆瓣新书的速递爬虫

地址:

豆瓣-新书速递icon-default.png?t=N7T8https://book.douban.com/latest?icn=index-latestbook-all

思路分析:

1.获取首页的响应数据(里面有我们需要的翻译链接) 

2.寻找下一页的地址,进行翻页,获取数据

代码实现

在爬虫文件的parse方法:

....
    # 1,构造翻页
    # 提取下一页url
    part_url = response.xpath('//span[@class="next"]//a/@href').extract_first()
    # 2,判断是否为下一页的条件
    if '?subcat=' in part_url:
        # 构造完整的url
        next_url = response.urljoin(part_url)
        print("下一页参数信息:", part_url)
        print("下一页链接:", next_url)
        # 构造scrapy.Request对象,并yield给引擎,利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析 
        yield scrapy.Request(url=next_url, callback=self.parse)

2.meta参数的使用:

在爬虫文件的parse方法里,提取详情页增加之前callback指定的parse_detail函数:

...
# 爬虫默认自带的解析方法
def parse(self,response):
    ...
     yield scrapy.Request(url=item['link'],
                                 callback=self.parse_detail, meta={'item': item})
...

# 新建一个解析方法 用于解析详情页 里面一定要有resposne参数
def parse_detail(self,response):
    # 获取meta传递过来的参数给item字典接收
    item = resposne.meta["item"]

1.meta参数是一个字典

2.meta字典中有一个固定的键proxy,表示代理ip。

3.定义实现随机User-Agent的下载中间件

在middlewares.py中完善代码middlewares.py中自带的代码可以删除掉

import random
class UserAgentDownloadMiddleware(object):
    user_agent = [
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
        'Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16.2'
    ]
    # 方法名是scrapy规定的方法 (协商机制)
    # 每个交给下载器的request对象都会经过该方法,并期望返回response
    def process_request(self, request, spider):
        # 获取随机请求头
        u_a = random.choice(self.user_agent)
        # 设置请求头
        request.headers['User-Agent'] = u_a

(1)在setting中设置开启自定义的下载中间件,设置方法同管道setting文件所写

4.代理ip的使用

(1)代理添加的位置:request.meta中增加proxy字段

(2)获取一个代理ip,赋值给request.meta['proxy']

具体的实现

class RandomProxy(object):
    ip_list = [
        '116.26.39.23:4215',
        '42.56.239.136:4278',
        '115.234.192.226:4275',
    ]
    def process_request(self, request, spider):
        proxy = random.choice(self.ip_list)
        # 需要加上https://,否则报错
        # 修改请求的元数据字典  用于给框架中其他组件传递信息 比如给其添加一个代理
        request.meta['proxy'] = 'https://' + proxy

同时在setting.py中开启中间件

DOWNLOADER_MIDDLEWARES = {
    'douban.middlewares.RandomProxy': 100,
    'douban.middlewares.UserAgentDownloadMiddleware': 200,
}

下一篇,附带豆瓣爬虫源码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eqwaak0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值