Как получить все ссылки на страницах формы? - PullRequest
1 голос
/ 01 февраля 2020

Мне нужно разобрать все ссылки с нескольких страниц. Я пишу простой скрипт, который использует асинхронный подход.

В данный момент он возвращает пустой список links. Но я ожидаю поместить все ссылки со страниц в список links и отобразить его на консоли.

Мой скрипт не содержит сообщений об ошибках.

import asyncio
import aiohttp
from bs4 import BeautifulSoup


links = []
host = 'https://avito.ru/saransk'
search_words = [
    'asus',
    'lenovo',
    'xiaomi',
    'apple',
    'ipad',
]


def get_data(html_text):
    paths = []
    soup = BeautifulSoup(html_text, 'lxml')
    link_obj = soup.find_all('a')

    for path in link_obj:
        paths.append(path['href'])

    links.extend(paths)

    return links


async def get_html(search_word):
    async with aiohttp.ClientSession() as session:
        resp = await session.get(host + '?q=' + search_word)   
        assert resp.status == 200
        # print(await resp.text())
        resp2 = await get_data(resp.text())
        print('----------', resp2)


def main():
    ioloop = asyncio.get_event_loop()
    tasks = [ioloop.create_task(get_html(word)) for word in search_words]
    ioloop.run_until_complete(asyncio.wait(tasks))
    ioloop.close()
    print(links)


main()

Я использую python 3.8 и следуйте требованиям:

aiohttp==3.6.2
  - async-timeout [required: >=3.0,<4.0, installed: 3.0.1]
  - attrs [required: >=17.3.0, installed: 19.3.0]
  - chardet [required: >=2.0,<4.0, installed: 3.0.4]
  - multidict [required: >=4.5,<5.0, installed: 4.7.4]
  - yarl [required: >=1.0,<2.0, installed: 1.4.2]
    - idna [required: >=2.0, installed: 2.8]
    - multidict [required: >=4.0, installed: 4.7.4]
bs4==0.0.1
  - beautifulsoup4 [required: Any, installed: 4.8.2]
    - soupsieve [required: >=1.2, installed: 1.9.5]
fake-useragent==0.1.11
lxml==4.5.0
requests==2.22.0
  - certifi [required: >=2017.4.17, installed: 2019.11.28]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: >=2.5,<2.9, installed: 2.8]
  - urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.8]

1 Ответ

1 голос
/ 02 февраля 2020

Попробуйте это.

from simplified_scrapy.request import req
from simplified_scrapy.simplified_doc import SimplifiedDoc
url = 'https://avito.ru/saransk?q=asus'
html = req.get(url) 
doc = SimplifiedDoc(html)
print(doc.listA(url=url))

Ниже приведен пример использования frameimpified_scrapy.

from simplified_scrapy.spider import Spider, SimplifiedDoc
class MySpider(Spider):
  name = 'avito.ru'
  allowed_domains = ['avito.ru']
  # concurrencyPer1s=1
  refresh_urls = True # For debug. If efresh_urls = True, start_urls will be crawled again.
  def __init__(self):
    host = 'https://avito.ru/saransk'
    search_words = ['asus', 'lenovo', 'xiaomi', 'apple', 'ipad']
    self.start_urls = [host+'?q='+w for w in search_words] # Initialize variable start_urls
    Spider.__init__(self,self.name) #necessary

  def extract(self, url, html, models, modelNames):
    doc = SimplifiedDoc(html)
    print (doc.listA(url=url['url']))
    # return {"Urls": doc.listA(url=url['url']), "Data": None} # Return data to framework
    return True

from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(MySpider()) # Start crawling

Вот еще несколько примеров: https://github.com/yiyedata/simplified-scrapy-demo

...