爬虫时IP总是被封?我来教你一招

(点击上方公众号,我们一起学Python)

   阅读文本大概需要 3 分钟。

来源:猿人学Python

编辑:pk哥

在我抓取网站遇到瓶颈,想剑走偏锋去解决时,常常会先去看下该网站的 robots.txt 文件,有时会给你打开另一扇抓取之门。

写爬虫有很多苦恼的事情,比如:

1.访问频次太高被限制;

2.如何大量发现该网站的 URL;

3.如何抓取一个网站新产生的 URL,等等;

这些问题都困扰着爬虫选手,如果有大量离散 IP 和账号,这些都不是问题,但是绝大部分公司都不具备这个条件的。

我们在工作中写的爬虫大多是一次性和临时性的任务,需要你快速完成工作就好,当遇到上面情况,试着看下 robots.txt 文件。

举个栗子:

老板给你布置一个任务,把豆瓣每天新产生的影评,书评,小组帖子,同城帖子,个人日志抓取下来。

初想一下,这任务得有多大,豆瓣有 1.6 亿注册用户,光是抓取个人日志这一项任务,每个人的主页你至少每天要访问一次。

这每天就得访问 1.6 亿次,小组/同城帖子等那些还没算在内。

设计一个常规爬虫,靠着那几十个 IP 是完不成任务的。

初窥robots.txt

当老板给你了上面的任务,靠着你这一两杆枪,你怎么完成,别给老板讲技术,他不懂,他只想要结果。

我们来看下豆瓣的 robots.txt。

https://www.douban.com/robots.txt

看图片上面红框处,是两个 sitemap 文件

打开 sitemap_updated_index 文件看一下:

里面是一个个压缩文件,文件里面是豆瓣头一天新产生的影评,书评,帖子等等,感兴趣的可以去打开压缩文件看一下。

也就是说每天你只需要访问这个 robots.txt 里的 sitemap 文件就可以知道有哪些新产生的 URL。

不用去遍历豆瓣网站上那几亿个链接,极大节约了你的抓取时间和爬虫设计复杂度,也降低了豆瓣网站的带宽消耗,这是双赢啊,哈哈。

上面通过 robots.txt 的 sitemap 文件找到了抓取一个网站新产生 URL 的偏方。沿着该思路也能解决发现网站大量 URL 的问题。

再举个栗子:

老板又给你一个任务,老板说上次抓豆瓣你说要大量 IP 才能搞定抓豆瓣每天新产生的帖子,这次给你 1000 个 IP 把天眼查上的几千万家企业工商信息抓取下来。

看着这么多 IP 你正留着口水,但是分析网站后发现这类网站的抓取入口很少(抓取入口是指频道页,聚合了很多链接的那种页面)。

很容易就把储备的 URL 抓完了,干看着这么多 IP 工作不饱满。

如果一次性能找到这个网站几万乃至几十万个 URL 放进待抓队列里,就可以让这么多 IP 工作饱满起来,不会偷懒了。

我们来看他的robots.txt文件:

https://www.tianyancha.com/robots.txt

打开红框处的 sitemap,里面有 3 万个公司的 URL,上图是 1 月 3 号生成的,那个URL 是根据年月日生成的,你把 URL 改成 1 月 2 号,又能看到 2 号的sitemap里的几万个公司 URL,这样就能发现十几万个种子 URL 供你抓取了。

PS:上面的 sitemap 其实也能解决抓取天眼查最近更新的,新产生 URL 的问题。

小小的一个取巧,既降低了爬虫设计的复杂度,又降低了对方的带宽消耗。

这在工作中非常适用,工作中不会在意你用的框架多好,只在意你做事的快慢和好坏。

善于看 robots.txt 文件你会发现一些别有洞天的东西。

觉得对你有一点帮助的话帮忙点点好看,戳下鸡腿,也可以转发给更多的伙伴。

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

「pk哥」以梦为马,不负韶华

长按识别二维码关注

推荐阅读

欢迎点击下方小程序留言讨论。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了设置IP自动循环切换,你可以使用代理池和代理IP来实现。代理池是一个代理IP的池子,可以从中随机取出一个代理IP来使用。代理IP是一种中间代理服务器,它可以隐藏你的真实IP地址,并代替你发送请求。 下面是一个简单的Python代码示例,演示如何使用代理池和代理IP来实现IP自动循环切换: ```python import requests from itertools import cycle proxies = { 'http': 'http://127.0.0.1:8000', 'https': 'http://127.0.0.1:8000' } proxy_pool = cycle([ 'http://1.2.3.4:8080', 'https://5.6.7.8:8080', 'http://9.10.11.12:8080' ]) for i in range(10): # 从代理池中取出一个代理IP proxy = next(proxy_pool) print("Using proxy", proxy) # 使用代理IP发送请求 try: response = requests.get('http://example.com', proxies={'http': proxy, 'https': proxy}) print(response.text) except requests.exceptions.RequestException as e: print(e) ``` 在上面的代码中,我们首先定义了一个代理池,其中包含了多个代理IP。然后我们使用`cycle`函数来创建一个循环器,它可以从代理池中无限循环取出代理IP。最后我们使用`next`函数来从循环器中取出下一个代理IP,并使用`requests`库发送请求指定这个代理IP。这样就可以实现IP自动循环切换了。 需要注意的是,代理池中的代理IP需要不定期地更新,否则可能会出现无效的代理IP。同,使用代理IP也会降低请求速度,需要根据具体情况来选择合适的代理IP数量和更新频率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值