Очистка миллионов записей с запросами и lxml занимает слишком много времени - PullRequest
0 голосов
/ 06 сентября 2018

Пишу простой скребок с запросами и 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 голосов
/ 06 сентября 2018

Если я попробую ваш код, а затем перечислю ваши атрибуты:

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 ', ' ДИКТ ', ' реж ', ' документ ', ' введите ', ' экв ', ' выход ', ' Формат ', ' GE ', ' GetAttribute ', ' GetState ', '* * 1 032 * 1033 GT *', ' хэш ', ' INIT ', ' ИТЭР ', ' ле ', '* 1 042 * * 1043 л *', ' модуль ', ' пе ', ' новый ', ' отлична от нуля ', ' уменьшить ', ' reduce_ex ', ' магнезии ', ' SetAttr ', ' SetState ', ' SizeOf ', ' 1065 * ул *, ' subclasshook ', ' weakref ', '_Content', '_Content_consumed', '_следующий', 'Apparent_encoding', 'близко', «Соединение», «Содержание», 'печенье', «Прошло», «Кодирование», «заголовки», «История», 'Is_permanent_redirect', 'Is_redirect', 'Iter_content', 'iter_lines', 'JSON', «ссылки», 'следующий', 'Хорошо', 'Raise_for_status', «Сырые», «Разум», 'запрос', 'Status_code', 'текст', 'URL']

Я не вижу html, поэтому вы получаете ошибку attr.

Теперь важная часть, если вы проверите r.status_code (код статуса ответа)

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

Что является не найденной ошибкой, в основном указанный вами URL-адрес НЕ существует или, по крайней мере, не виден для меня.

0 голосов
/ 06 сентября 2018

Вы должны сделать это с помощью 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 в переменной дерева

...