Python 通过请求和lxml抓取数以百万计的记录花费的时间太长
我正在用请求和lxml编写简单的scraper 代码工作正常,但要抓取数百万条记录需要10天以上的时间。使用这两个模块是否有可能加快速度,还是只有使用像scrapy这样的异步框架才有可能 以下是完整的代码:Python 通过请求和lxml抓取数以百万计的记录花费的时间太长,python,python-3.x,web-scraping,python-requests,Python,Python 3.x,Web Scraping,Python Requests,我正在用请求和lxml编写简单的scraper 代码工作正常,但要抓取数百万条记录需要10天以上的时间。使用这两个模块是否有可能加快速度,还是只有使用像scrapy这样的异步框架才有可能 以下是完整的代码: import requests from lxml import html profile = 10100 #start from this profile i = 0 while i<1000000: url = ("https://www.example.com/prof
import requests
from lxml import html
profile = 10100 #start from this profile
i = 0
while i<1000000:
url = ("https://www.example.com/profile/10100")
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
r = requests.get(url, headers=headers)
doc = html.fromstring(r.content)
mod = doc.xpath("//*[@id = 'achievement104' and @class='achievement ']/text()")
name = doc.xpath("/html/body/div[2]/div/div/div[1]/div/div[2]/h1/text()")
if len(mod) != 0: #if match
print("Moderator!", name)
else:
print("Not moderator!", name)
profile += 1 #go to another profile
i += 1
导入请求
从lxml导入html
配置文件=10100#从该配置文件开始
i=0
而我您应该使用libxml来实现这一点
from lxml import html
import requests
url = ("https://www.example.com/profile/10100")
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
r = request.get(url, headers=headers)
tree = html.fromstring(r.content)
然后,您可以在树变量中使用xpath,您应该使用libxml
from lxml import html
import requests
url = ("https://www.example.com/profile/10100")
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
r = request.get(url, headers=headers)
tree = html.fromstring(r.content)
然后,如果我尝试您的代码,您可以在树变量中使用xpath,然后列出您拥有的属性:
import requests
url = ("https://www.example.com/profile/10100")
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
r = requests.get(url, headers=headers)
dir(r)
['attrs',
“bool”,
“类”,
“delattr”,
“dict”,
“dir”,
“doc”,
“输入”,
“eq”,
“退出”,
“格式”,
“ge”,
“getattribute”,
“getstate”,
“gt”,
“散列”,
“init”,
“国际热核实验堆”,
“le”,
“lt”,
“模块”,
“ne”,
“新建”,
“非零”,
“减少”,
“减少_ex”,
“repr”,
“setattr”,
“设置状态”,
“sizeof”,
“str”,
“子类hook”,
“weakref”,
"内容",,
"内容",,
"下一步",,
“表观编码”,
“结束”,
“连接”,
“内容”,
“饼干”,
"过去",,
“编码”,
“标题”,
"历史",,
“是永久性的吗?”,
“是否重定向”,
“国际热核聚变实验堆内容”,
“国际热核聚变实验堆线”,
“json”,
“链接”,
“下一个”,
“好的”,
“为_状态提升_”,
“生的”,
“原因”,
“请求”,
“状态代码”,
“文本”,
'网址']
我看不到html,这就是为什么会出现attr错误
现在是重要的部分,如果您检查r.status_代码(响应状态代码)
这是一个未找到的错误,基本上您指定的url不存在,或者至少对我来说不可见。如果我尝试您的代码,然后列出您拥有的属性:
import requests
url = ("https://www.example.com/profile/10100")
headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"}
r = requests.get(url, headers=headers)
dir(r)
['attrs',
“bool”,
“类”,
“delattr”,
“dict”,
“dir”,
“doc”,
“输入”,
“eq”,
“退出”,
“格式”,
“ge”,
“getattribute”,
“getstate”,
“gt”,
“散列”,
“init”,
“国际热核实验堆”,
“le”,
“lt”,
“模块”,
“ne”,
“新建”,
“非零”,
“减少”,
“减少_ex”,
“repr”,
“setattr”,
“设置状态”,
“sizeof”,
“str”,
“子类hook”,
“weakref”,
"内容",,
"内容",,
"下一步",,
“表观编码”,
“结束”,
“连接”,
“内容”,
“饼干”,
"过去",,
“编码”,
“标题”,
"历史",,
“是永久性的吗?”,
“是否重定向”,
“国际热核聚变实验堆内容”,
“国际热核聚变实验堆线”,
“json”,
“链接”,
“下一个”,
“好的”,
“为_状态提升_”,
“生的”,
“原因”,
“请求”,
“状态代码”,
“文本”,
'网址']
我看不到html,这就是为什么会出现attr错误
现在是重要的部分,如果您检查r.status_代码(响应状态代码)
这是一个未找到的错误,基本上您指定的url不存在,或者至少对我来说不可见。感谢您的回复E.Serra,似乎我的问题在于所选模块。我使用了请求,但使用了名为requests html:Dhappy的模块中的命令来提供帮助,很高兴知道它起作用了。顺便说一句,请求是一个非常棒的模块,请求看起来非常棒:)无论如何,我重写了我的脚本,现在它“工作”。只有一个问题,脚本太慢了:(有没有办法让它更快?现在它每秒只抓取1个配置文件。当我想永远抓取数以百万计的记录时,它会一直运行。:XHey,你能回答我吗?:)不幸的是,sololearn似乎没有API。API是一种允许你进行这些查询的技术(比如要求用户列表)。他们故意不将其设置为公共,这意味着你不应该这样做。如果你仍然想这样做,你可以用一个进程等待很长时间(你不想这样做),将for循环划分为不同的脚本(比如10个脚本,每个脚本执行1/10的请求)或者设置一些异步的东西,但是你可能最终会被禁止,所以请小心,谢谢你的回复。E.Serra,我的问题似乎出在所选的模块上。我使用了请求,但使用了名为requests html:Dhappy的模块中的命令来帮助我,很高兴知道它起了作用。顺便说一句,请求是一个很棒的模块,请求看起来真的很棒:)无论如何,我重写了我的脚本,现在它“工作”。只有一个问题,脚本太慢了:(有没有办法让它更快?现在它每秒只抓取1个配置文件。当我想永远抓取数以百万计的记录时,它会一直运行。:XHey,你能回答我吗?:)不幸的是,sololearn似乎没有API。API是一种允许你进行这些查询的技术(比如要求用户列表)。他们故意不将其设置为公共,这意味着你不应该这样做。如果你仍然想这样做,你可以用一个进程等待很长时间(你不想这样做),将for循环划分为不同的脚本(比如10个脚本,每个脚本执行1/10的请求)或者设置一些异步的,但是你可能会被禁止,所以要小心。谢谢你,asa,lxml看起来很棒。谢谢你,asa,lxml看起来很棒。