gpt4 book ai didi

python - 使用多线程提高网页抓取速度

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:33 24 4
gpt4 key购买 nike

我遇到了一点困难。

有一个格式为:https://www.example.com/blahblah/moreblah.php?x=123456789&lang=en 的网址

如您所见,查询中有一个唯一标识符(在此示例中 UID = 123456789)。我编写的脚本将提取 x = 123456789 的页面所需的所有信息。我还将脚本放入循环中,并将 UID 的计数增加一(见下文)。所有 UID 中只有大约 4% 具有数据,但我无法识别哪些 UID 包含数据(我尝试生成 xml 站点地图,但运气不佳 - 不断收到“站点不可索引”)。

现有的代码可以工作,问题是这个方法会花费太长的时间。我快速计算了一下,(理论上)需要数年时间来检查 0 到 5400 万之间的每个 UID(我浏览了该网站,发现 UID 高达 5300 万)。

我认为有以下几种选择:1. 多线程/池(不知道如何做到这一点)。另外,按照下面的循环设置方式,一个循环必须完成才能使 uid 加 1,然后才能执行下一个查询(请参见第 20 行)。
2.找到爬行网站的方法并准确识别需要抓取哪些ID,然后将循环限制为这些确切的ID。

我也愿意接受其他建议。

import urllib2
from bs4 import BeautifulSoup

proxy = urllib2.ProxyHandler({'https': xxx.xx.xxx.xxx:xxxx})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
uid = 0
def scrape (uid):
while uid < 54000000:
page = urllib2.urlopen("https://www.example.com/blahblah/moreblah.php?x={}&lang=en".format(str(uid)))
soup = BeautifulSoup(page, 'html.parser')
x = soup.find_all('div', id="container")
x_string = str(x)
try:
parsing the x_string
except:
print "There is no data on this page"
uid+=1

scrape(uid)

最佳答案

多线程在这里没有帮助。即使您可以并行发出多个请求,您仍然需要发出总共 54MM+ 的 HTTP 请求。处理这些请求会给远程 Web 服务器带来巨大的负载。 (仅来自网络服务器的 404 响应就很容易达到数百 GB 的数据。)如果您尝试这样做,您的爬网程序可能会在爬网完成之前很久就被阻止访问该网站。

您需要找到其他方法来确定哪些 ID 有效。

关于python - 使用多线程提高网页抓取速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52899943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com