Python 通过请求和lxml抓取数以百万计的记录花费的时间太长

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

我正在用请求和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/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看起来很棒。