@aqau123

Как исправить проблему в парсинге авито?

Возникла проблема с парсингом авито.
from tqdm import tqdm
from bs4 import BeautifulSoup
import asyncio
from scripts import config, search, excel, headers, asyncfetch, Files
import os, sys
import time, random
import requests

class Counter(object):
    def __init__(self, startingValue: int) -> None:
        self.counter = startingValue

    def increaseCounter(self) -> None:
        self.counter += 1

async def makeRequest(f: asyncfetch.Fetch, url: str, mode: str):
    rFlag = False
    r = None

    while not rFlag:
        try:
            cProxy = 'http://{}'.format(random.choice(proxyList))

            result = await f.fetch(url=url, mode=mode, headers=random.choice(headers.headers), proxy=cProxy)

            print(time.strftime(config.settings['timeFormat'], time.localtime()),
                  'Made request. Status: {}'.format(result[1]))

            if result[1] == 200:
                r = result[0]
                rFlag = True

        except Exception as e:
            print(time.strftime(config.settings['timeFormat'], time.localtime()),
                  'Made request. Status: Error. {}'.format(e))

    return r

async def findMaxPage(f: asyncfetch.Fetch, url:str, mode:str):
    return await makeRequest(f, url, mode=mode)

pageCounter = Counter(1)
itemsCounter = Counter(1)

f = asyncfetch.Fetch()

async def main():
    maxPage = await findMaxPage(f, 'https://www.avito.ru/', mode='text')
    # print(maxPage)

if __name__ == '__main__':
    print(time.strftime(config.settings['timeFormat'], time.localtime()), 'Started.')

    finishTime = time.strftime('%a-%b-%Y-%H-%M', time.localtime())

    print(time.strftime(config.settings['timeFormat'], time.localtime()), 'Initializing...')

    proxyList = Files.Files.readFile(config.PROXIES)

    policy = asyncio.WindowsSelectorEventLoopPolicy()

    asyncio.set_event_loop_policy(policy)

    loop = asyncio.get_event_loop()

    print(time.strftime(config.settings['timeFormat'], time.localtime()), 'Initialized.')

    loop.run_until_complete(main())

    print(time.strftime(config.settings['timeFormat'], time.localtime()), 'Authorization done.')

    # links = [
    #     search.link + '&p=' + str(i) for i in range(1, int(maxPage) + 1)
    # ]

    # print(links)

    path = os.path.join(os.getcwd(), 'avito-{}.csv'.format(finishTime))

    items = []

    print(time.strftime(config.settings['timeFormat'], time.localtime()), 'Finished. {}'.format(path))

Код чуть не прибран, поэтому где-то принты не те, т.к. быстро перекидывал скрипт на айохттп, когда выяснилось, что заказчику очень важно время, а ПК его не вытянет селениум в мультипроцессе.
Вот что выплевывается в консоль.
[17:36:41] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://122.232.151.67:8085')
[17:36:42] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://36.22.141.194:8908')
[17:36:45] Made request. Status: Bad proxy. Cannot connect to host 49.82.27.184:8089 ssl:default [Connect call failed ('49.82.27.184', 8089)]
[17:36:46] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://36.22.163.47:8908')
[17:37:07] Made request. Status: Bad proxy. Cannot connect to host 113.11.20.187:8080 ssl:default [Connect call failed ('113.11.20.187', 8080)]
[17:37:14] Made request. Status: Bad proxy. Cannot connect to host www.avito.ru:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1124)')]
[17:37:14] Made request. Status: Bad proxy. Server disconnected
[17:37:16] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://175.17.182.45:8085')
[17:37:18] Made request. Status: 403
[17:37:19] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://60.169.221.188:8908')
[17:37:26] Made request. Status: Bad proxy. [WinError 10054] An existing connection was forcibly closed by the remote host
[17:37:40] Made request. Status: 403
[17:38:14] Made request. Status: 403
[17:38:15] Made request. Status: Bad proxy. [WinError 10054] An existing connection was forcibly closed by the remote host
[17:38:16] Made request. Status: 403
[17:38:17] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://199.19.225.250:80')
[17:38:38] Made request. Status: Bad proxy. Cannot connect to host 114.233.70.65:9000 ssl:default [Connect call failed ('114.233.70.65', 9000)]
[17:38:44] Made request. Status: 403
[17:38:50] Made request. Status: 403
[17:38:57] Made request. Status: 403
[17:38:58] Made request. Status: 403
[17:38:59] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://199.19.225.250:80')
[17:39:20] Made request. Status: Bad proxy. Cannot connect to host 27.153.140.36:23180 ssl:default [Connect call failed ('27.153.140.36', 23180)]
[17:39:20] Made request. Status: Bad proxy. 400, message='Bad Request', url=URL('http://115.46.81.147:8085')
[17:39:42] Made request. Status: Bad proxy. Cannot connect to host 89.140.125.17:80 ssl:default [Connect call failed ('89.140.125.17', 80)]
[17:39:42] Made request. Status: 403

asyncfetch - самописный модуль для асинхронных запросов, там и баундфетч есть, в общем, там все для быстрого написания каркасов скриптов.
хедеры подтягиваются из файлика headers, там лежит массив на 5т. строк из сгенеренных либой fake_useragent, ибо у некоторых заказчиков проблемы с этой либо, устаешь каждому объяснять что и как установить, сделать.
прокси используются средние - best-proxies. не знаю, ничего не могу сказать, прокси как прокси, не часто ими пользовался, но, когда пользовался - не подводили ни разу.
вследствие полученных логов возникает вопрос. Это прокси не дотягивают по качеству, т.к. они вроде их сами ищут из списков бесплатных, или же проблема в чем-то другом, По типу сертификатов SSL?
Если проблема в прокси, то можете посоветовать хорошие, пусть и дорогие даже.
Если проблема в чем-нибудь другом, то можно ссылочку.
Заранее спасибо.
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
полковник Андрейченко
60.169.221.188 кетай, в Авито ж не идиоты

парсить надо уметь )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы