Скрипт выдает какую-то ошибку в какой-то момент выполнения - PullRequest
0 голосов
/ 15 июня 2019

Я создал скрипт на python, используя pyppeteer , чтобы собирать ссылки на разные посты с веб-страницы, а затем анализировать заголовок каждого поста по переходя на целевую страницу, используя эти собранные ссылки. Хотя контент статичен, мне нравится знать, как работает pyppeteer в таких случаях.

Я пытался передать эту переменную browser из функции main() в функции fetch() и browse_all_links(), чтобы я мог снова и снова использовать один и тот же браузер.

Мой текущий подход:

import asyncio
from pyppeteer import launch

url = "https://stackoverflow.com/questions/tagged/web-scraping"

async def fetch(page,url):
    await page.goto(url)
    linkstorage = []
    await page.waitForSelector('.summary .question-hyperlink')
    elements = await page.querySelectorAll('.summary .question-hyperlink')
    for element in elements:
        linkstorage.append(await page.evaluate('(element) => element.href', element))
    return linkstorage

async def browse_all_links(page,link):
    await page.goto(link)
    await page.waitForSelector('h1 > a')
    title = await page.querySelectorEval('h1 > a','(e => e.innerText)')
    print(title)

async def main():
    browser = await launch(headless=False,autoClose=False)
    [page] = await browser.pages()
    links = await fetch(page,url)
    tasks = [await browse_all_links(page,url) for url in links]
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    asyncio.run(main())

Приведенный выше скрипт извлекает некоторые заголовки, но в какой-то момент выполнения выдает следующую ошибку:

Possible to select <a> with specific text within the quotes?
Crawler Runs Too Slow
How do I loop a list of ticker to scrape balance sheet info?
How to retrive the url of searched video from youtbe using python
VBA-JSON to import data from all pages in one table
Is there an algorithm that detects semantic visual blocks in a webpage?
find_all only scrape the last value

#ERROR STARTS

Future exception was never retrieved
future: <Future finished exception=NetworkError('Protocol error (Runtime.releaseObject): Cannot find context with specified id')>
pyppeteer.errors.NetworkError: Protocol error (Runtime.releaseObject): Cannot find context with specified id
Future exception was never retrieved

1 Ответ

1 голос
/ 17 июня 2019

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

  • Имеется 15 ссылок, но вы получаете только 7, возможно, веб-сокеты теряют соединение и страница больше недоступна

  • Понимание списка

    tasks = [await browse_all_links(page,url) for url in links] Что ожидает этот список? Если это удастся, это будет список ни одного элемента. Так что ваша следующая строка кода выдаст ошибку!

  • Решение

    понизить веб-сокеты 7.0 до веб-сокетов 6.0

    удалить эту строку кода await asyncio.gather(*tasks)

    Я использую Python 3.6, поэтому мне пришлось изменить последнюю строку кода. Вам не нужно менять его, если вы используете Python 3.7, который, я думаю, вы используете

import asyncio
from pyppeteer import launch

url = "https://stackoverflow.com/questions/tagged/web-scraping"

async def fetch(page,url):
    await page.goto(url)
    linkstorage = []
    await page.waitForSelector('.summary .question-hyperlink')
    elements = await page.querySelectorAll('.summary .question-hyperlink')
    for element in elements:
        linkstorage.append(await page.evaluate('(element) => element.href', element))
    return linkstorage

async def browse_all_links(page,link):
    await page.goto(link)
    await page.waitForSelector('h1 > a')
    title = await page.querySelectorEval('h1 > a','(e => e.innerText)')
    print(title)
async def main():
    browser = await launch(headless=False,autoClose=False)
    [page] = await browser.pages()
    links = await fetch(page,url)
    tasks = [await browse_all_links(page,url) for url in links]
    #await asyncio.gather(*tasks)
    await browser.close()
if __name__ == '__main__':
    #asyncio.run(main())
    asyncio.get_event_loop().run_until_complete(main())
  • выход
(testenv) C:\Py\pypuppeteer1>python stack3.py
Scrapy Shell response.css returns an empty array
Scrapy real-time spider
Why do I get KeyError while reading data with get request?
Scrapy spider can't redefine custom_settings according to args
Custom JS Script using Lua in Splash UI
Can someone explain why and how this piece of code works [on hold]
How can I extract required data from a list of strings?
Scrapy CrawlSpider rules for crawling single page
how to scrap a web-page with search bar results, when the search query does not
appear in the url
Nested for loop keeps repeating
Get all tags except a list of tags BeautifulSoup
Get current URL using Python and webbot
How to login to site and send data
Unable to append value to colums. Getting error IndexError: list index out of ra
nge
NextSibling.Innertext not working. “Object doesn't support this property”
...