我正在用请求和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
谢谢。
答案 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
这是找不到错误,基本上您指定的网址不存在,或者至少对我不可见。