想爬取一个有很多页的网站,但是我不知道这个网站的准确页数。请问 Python 中如何用循环来实现呢?

2019-07-27 13:20:26 +08:00
 solider245

如题,假如网址是

www.baidu.com/page_01
www.baidu.com/page_02
www.baidu.com/page_03
www.baidu.com/page_0{i}

字母 i 代表页数,以前我爬取的网站,i 的数字是明确的,一般是 100,200,或者 300 以内。 这个时候我可以用 range(1,300)这样生成循环数来搞定。

现在有一个网站,这个自增数量太大,我应该如何用条件判断和循环来解决这个问题呢?

5526 次点击
所在节点    Python
41 条回复
wzwwzw
2019-07-27 13:38:05 +08:00
scrapy rule .
xiaoming1992
2019-07-27 13:39:54 +08:00
设置一个尽可能大的值,循环过程中进行判断,没爬到希望的内容就跳出循环并通知你,你再人肉看看后面还有没有,再进行下一步操作?
limuyan44
2019-07-27 13:40:04 +08:00
这种算最简单的爬取规则了吧你一直爬到没有不就好了。
ranleng
2019-07-27 13:40:26 +08:00
while true。
然后 404 的时候 break 掉
wzwwzw
2019-07-27 13:41:03 +08:00
lihongjie0209
2019-07-27 13:46:13 +08:00
while 不行啊
solider245
2019-07-27 13:49:01 +08:00
@ranleng #4 请问可以稍微写一个例子吗?
solider245
2019-07-27 13:49:59 +08:00
@xiaoming1992 #2 设置最大值会遇到一种情况,就是以后当网站的页数超过你的最大值时,你的爬虫就要去更新了
solider245
2019-07-27 13:50:11 +08:00
@wzwwzw #5 谢谢,我去看下
xiaoming1992
2019-07-27 13:54:34 +08:00
本来就是啊,所以说尽可能大啊,比方说一百万,不够就设个三十亿(我怎么会说是我忘了 while true 呢)。

另外,爬虫肯定要不定期更新的啊,因为人家也会更新反爬规则啊。
cherbim
2019-07-27 13:58:16 +08:00
while ture,然后判断获取 http 的状态码,是 200 就继续循环,不是就跳出循环
solider245
2019-07-27 14:18:28 +08:00
@xiaoming1992 #10 我其实已经说了,这个设置最大值这块其实我已经会了。
感觉看别人的代码,似乎有三种写法,if/else,try/expect,while ture 这个例子我还真没见过。
solider245
2019-07-27 14:18:38 +08:00
@cherbim #11 能大概写个小例子吗?
cherbim
2019-07-27 14:26:49 +08:00
@solider245 当然可以啊,比如查询从你发布的帖子到现在发布了多少新帖
代码如下:
import requests

url = r"https://www.v2ex.com/t/"
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}
i = 586668
while True:
page_url = url + str(i)
print(page_url)
r = requests.get(page_url, header)
if r.status_code == 200:
i = i + 1
else:
break
print("自楼主发帖起一共更新了" + str(i - 586668 - 1) + "贴")
cherbim
2019-07-27 14:27:50 +08:00
我靠,这破站真是“小气鬼”,我就查了几次,把我 IP ban 了
cherbim
2019-07-27 14:34:18 +08:00
loading
2019-07-27 14:48:47 +08:00
我用人工都能很快地尝试出来。
二分法。
solider245
2019-07-27 14:49:41 +08:00
@cherbim #14 原来是这个原理,好的,谢谢哈,我按照这个逻辑,尝试一下
JasonEWNL
2019-07-27 14:56:59 +08:00
比如你找到当前页的 “下一页” 特征(标签啊各种,一般靠 re 扒出来)定义为 next_url 啥的,然后在 while True 循环里 if next_url 就行了,只要一直有就会一直爬,没有就终止了。(以上来自以前爬多页漫画网站的经验)
dongyx
2019-07-27 16:26:33 +08:00
楼主,这个可以用二分搜索解决啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX