讲讲Scrapy翻页的那些事

Scrapy翻页的那些事

常见的两种是通过分析每页URL或者是请求体发现规律写通用URL跟查找当前页面中下一页面的URL实现翻页!

一、通过当前页面获取下一页URL

适用于有【下一页】按钮的网站,且能获取到【下一页】URL的。

在这里插入图片描述

而往往我们获取的下一页URL并不是完整的,那该怎么去补全URL?

以下介绍了三种方法 拼接法、补全法、自动识别。

【注】part_next_url:是通过xpath获取的部分下一页 url ; self.start_urls[0]:是我们第一次启动爬虫请求的request 。

第一种:拼接法
# 第一种  拼接法
root_url = 'https://www.guokr.com'
next_url = root_url + part_next_url
# print(next_url)

# 翻页
# 第一种翻页 callback 获取的下一页的url,需要手动指定,将获取的响应,交给parse处理
yield scrapy.Request(next_url, callback=self.parse)
第二种:补全法
# 第二种  补全法
from urllib.parse import urljoin
root_url = self.start_urls[0]
next_url = urljoin(root_url, part_next_url)
# print(next_url)

# 翻页
# 第二种翻页 callback 获取的下一页的url,也是需要手动指定,将获取的响应,交给parse处理
yield scrapy.Request(next_url, callback=self.parse)
第三种:自动识别补全
# 第三种(自动根据response 里面的url,进行识别补全)
# 翻页
yield response.follow(part_next_url, callback=self.parse)

二、通过分析URL规律获取下一页

适用于没有【下一页】按钮,或者【下一页】按钮获取不到URL时

是不是现在觉得第一种方法翻页带有一定的局限性啊!

第一种方法是基于当前页中的【下一页】去获取URL,但有些网站并没有这么设计。比如说下面这种,并不能通过【下一页】获取到URL。

在这里插入图片描述

通过分析每一页URL来寻找规律,

再比如说 糗事百科 每一页的url如下:

第一页https://www.qiushibaike.com/text/

第二页https://www.qiushibaike.com/text/page/2/

第三页https://www.qiushibaike.com/text/page/3/

通过上面我们会发现,第二页时,结尾带的参数是2,第三页时,结尾带的参数是3,后面也是一样,那是不是说第几页这个结尾参数就是几,那第一页也不同啊?

那我们测试下,按照我们刚才发现的规律去仿写第一页,那是不是就是https://www.qiushibaike.com/text/page/1/, 带着这个url去访问,发现确实是第一页的内容,说明最后数字是几,那就是第几页。

代码如下:

page = 2
def parse(self, response):   
    # ...<parse方法中间的代码块这里先省略>
    # 翻页
    if self.page <= 50:
        next_url = 'https://www.qiushibaike.com/text/page/{}/'.format(self.page)
        self.page += 1
        yield scrapy.Request(next_url, callback=self.parse)

【拓展】

细心的小朋友发现没,我的是从2开始的,以前我们知道为什么从1开始,因为一般都没有第0页对吧,但为什么这里是从2开始呢?

因为我们一开始已经定义好了起始的URL(start_urls),即第一页的URL。也就是说,第1页的URL并不需要我们去获取、去发起请求,所以我们,直接从2开始就行。其实也可以从1开始,且结果都是一样,只是这是多余的一步!

那为什么从第1页得到的结果也是一样的呢?不应该是第一页内容会重复吗?

我们了解下Scrapy,它是有去重功能的,在爬虫中是会去除已经爬取过的URL,避免重复爬取,既影响爬虫效率,又产生冗余数据。

这个拓展也只是了解认识下Scrapy的一些特性,从多少开始,具体还是看实际需求。

以上就是我目前所掌握的,如果有理解错误的,还请大佬在评论区指出来,非常感谢!

以上就是Scrapy翻页那些事的所有内容了,点赞收藏加评论是最大的支持哦!

📑编写不易,转载请注明出处,如有侵权,请联系我!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodeBoy‍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值