Использование одной и той же ClientSession для получения нескольких разных URL - PullRequest
0 голосов
/ 29 октября 2018

Обычно я кодирую в запросах, поэтому у меня нет большого опыта работы с aiohttp. Но так как запросы блокируют, я должен использовать aiohttp.

Так как мой код выглядит в запросах:

#Account gen code is here using requests 

r = requests.get(product_link)

watch_link = soup(r.text, "html.parser").find("div", {"id": "vi-atl-lnk"}).a["href"]

r = requests.get(watch_link)
r = requests.get(watch_link)   

Итак, он идет в листинг Ebay, а затем использует BS4, чтобы очистить ссылку для просмотра, которая находится в исходном коде этого листинга. Затем он использует GET-запрос для добавления списка в список наблюдения. На ссылку добавления в список наблюдения должно быть 2 запроса GET, в противном случае он не будет добавлен.

Ну, это было в запросах, но теперь мне нужно написать это в aiohttp. Самое близкое, что у меня есть, это:

session = aiohttp.ClientSession()

async def main():
    #Account gen code is here using aiohttp and session 
    async with session.get(product_link) as resp:
         r = await resp.text()
         watch_link = soup(r, "html.parser").find("div", {"id": "vi-atl-lnk"}).a["href"]
    async with session.get(watch_link) as respp:   
         time.sleep(.1)
    async with session.get(watch_link) as resp:   
         time.sleep(.1)

 loop = asyncio.get_event_loop()
 loop.run_until_complete(main())

Я попробовал это, и он запустился для меня, однако он не добавил элемент в список наблюдения. Код выше этого (не показан, так как он не имеет отношения к данной проблеме AFAIK) отлично выполнил и сделал аккаунт. Но это не работает, когда дело доходит до контрольного списка немного. Что может быть причиной этого?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018
        session = aiohttp.ClientSession()
        async with session.post(link,data=payload,headers=headers) as resp:
            print("Created account with email " + random_catchall)
        async with session.get(product_link,headers=headers) as response:
            r = await response.text()
            watch_link = soup(r, "html.parser").find("div", {"id": "vi-atl-lnk"}).a["href"]

            print("Connected to product")

        async with session.get(watch_link,headers=headers) as respp:
            print("Sucessfully added to watchlist")
        async with session.get(watch_link,headers=headers) as respp:
            print("Added to watch list")


        await session.close()

Это сработало для меня. Не нужно печенье или что-то в этом роде :)

0 голосов
/ 30 октября 2018

Я пробовал так много раз и, наконец, обнаружил, что возникла проблема с файлами cookie. И вам нужно изменить код на aiohttp.ClientSession(headers=headers). Кстати, правда может быть в печенье, где конвертировать ; в \073

Не aiohttp.ClientSession(headers=headers,cookies=cookies)

Там код, который я разобрался.

import aiohttp
import asyncio
from bs4 import BeautifulSoup as soup

product_link = ""

cookies = {"Cookie":"_ga=GA1.2.808...."}
headers = {"Connection": "keep-alive"}
headers.update(cookies)

async def main():
    #Account gen code is here using aiohttp and session 
    async with aiohttp.ClientSession(headers=headers) as sessions:

        async with sessions.get(product_link) as resp:
            r = await resp.text()
            watch_link = soup(r, "lxml").find("div", {"id": "vi-atl-lnk"}).a.get("href")
            print(watch_link)

        async with sessions.get(watch_link) as resp:
            pass

        async with sessions.get(watch_link) as resp:
            pass


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
...