Невозможно правильно выполнить мой скрипт, используя поток - PullRequest
0 голосов
/ 05 сентября 2018

Я пытался создать скребок, используя python в сочетании с Thread, чтобы ускорить выполнение. Скребок должен проанализировать все названия магазинов и их номера телефонов, пересекающие несколько страниц.

Скрипт работает без проблем. Поскольку я очень новичок в работе с Thread, я с трудом могу понять, что делаю это правильно.

Вот что я пробовал до сих пор:

import requests 
from lxml import html
import threading
from urllib.parse import urljoin 

link = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA&page={}"

def get_information(url):
    for pagelink in [url.format(page) for page in range(20)]:
        response = requests.get(pagelink).text
        tree = html.fromstring(response)
        for title in tree.cssselect("div.info"):
            name = title.cssselect("a.business-name span[itemprop=name]")[0].text
            try:
                phone = title.cssselect("div[itemprop=telephone]")[0].text
            except Exception: phone = ""
            print(f'{name} {phone}')

thread = threading.Thread(target=get_information, args=(link,))

thread.start()
thread.join()

Проблема в том, что Я не могу найти никакой разницы во времени или производительности , запускаю ли я вышеуказанный скрипт, используя Thread или без использования Thread. Если я ошибаюсь, как я могу выполнить вышеупомянутый скрипт, используя Thread?

РЕДАКТИРОВАТЬ: я пытался изменить логику, чтобы использовать несколько ссылок. Возможно ли это сейчас? Заранее спасибо.

1 Ответ

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

Вы можете использовать Threading, чтобы очистить несколько страниц в параллельном режиме, как показано ниже:

import requests
from lxml import html
import threading
from urllib.parse import urljoin

link = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA&page={}"

def get_information(url):
    response = requests.get(url).text
    tree = html.fromstring(response)
    for title in tree.cssselect("div.info"):
        name = title.cssselect("a.business-name span[itemprop=name]")[0].text
        try:
            phone = title.cssselect("div[itemprop=telephone]")[0].text
        except Exception: phone = ""
        print(f'{name} {phone}')

threads = []
for url in [link.format(page) for page in range(20)]:
    thread = threading.Thread(target=get_information, args=(url,))
    threads.append(thread)
    thread.start()
for thread in threads:
    thread.join()

Обратите внимание, что последовательность данных не будет сохранена. Это означает, что если поочередно очищать страницы, последовательность извлеченных данных будет:

page_1_name_1
page_1_name_2
page_1_name_3
page_2_name_1
page_2_name_2
page_2_name_3
page_3_name_1
page_3_name_2
page_3_name_3

в то время как с Threading данные будут смешаны:

page_1_name_1
page_2_name_1
page_1_name_2
page_2_name_2
page_3_name_1
page_2_name_3
page_1_name_3
page_3_name_2
page_3_name_3
...