使用请求和lxml清除数百万条记录花费的时间太长

时间:2018-09-06 13:00:50

标签: python python-3.x web-scraping python-requests

我正在用请求和lxml编写简单的刮板。

代码可以正常工作,但抓取数百万条记录需要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

谢谢。

2 个答案:

答案 0 :(得分:1)

您应该使用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

答案 1 :(得分:1)

如果我尝试您的代码,然后列出您具有的属性:

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 ',  “ 布尔”,  “ 课程”,  “ delattr ”,  “ dict ”,  “ 目录”,  “ doc ”,  “ 输入”,  “ eq ”,  “ 退出”,  “ 格式”,  “ ge ”,  “ 获取属性”,  “ getstate ”,  “ gt ”,  “ 哈希”,  “ 初始化”,  “ iter ”,  “ le ”,  “ lt ”,  “ 模块”,  “ ne ”,  “ ”,  “ 非零”,  “ 减少”,  “ reduce_ex ”,  “ 代表”,  “ setattr ”,  “ 设置状态”,  ' sizeof ',  ' str ',  “ 子类挂钩”,  “ 弱引用”,  '_内容',  '_content_consumed',  '_下一个',  'apparent_encoding',  '关',  '连接',  '内容',  '饼干',  '过去',  “编码”,  “标题”,  '历史',  'is_permanent_redirect',  'is_redirect',  'iter_content',  'iter_lines',  'json',  '链接',  '下一个',  '好',  'raise_for_status',  '生的',  '原因',  '请求',  '状态代码',  '文本',  'url']

我看不到html,这就是为什么您遇到attr错误的原因。

现在很重要,如果您检查r.status_code(响应状态代码)

In [107]: r.status_code
Out[107]: 404

这是找不到错误,基本上您指定的网址不存在,或者至少对我不可见。