【问题标题】:Ideal way of creating for loops using pyppeteer使用 pyppeteer 创建 for 循环的理想方法
【发布时间】:2018-11-26 12:20:30
【问题描述】:

我在python 中结合pyppeteer 编写了一个脚本,用于从网页上抓取不同咖啡店的名称及其电话号码。尽管我在下面尝试的方式可以达到目的,但脚本看起来确实很混乱。使用 pyppeteer 库创建 for 循环的理想方法是什么?

到目前为止我已经写了:

import asyncio
from pyppeteer import launch

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

async def get_names(link):
    wb = await launch(headless=True)
    page = await wb.newPage()
    await page.goto(link)

    containers = await page.querySelectorAll('div.v-card')
    for container in containers:
      name = await container.querySelector('.business-name span')
      phone = await container.querySelector('.phones')
      post = await page.evaluate('(element) => element.textContent', name)
      postAno = await page.evaluate('(element) => element.textContent', phone)
      print(f'{post}--{postAno}')

    await wb.close()

asyncio.get_event_loop().run_until_complete(get_names(url))

【问题讨论】:

    标签: python python-3.x web-scraping pyppeteer


    【解决方案1】:

    我会这样做:

    import asyncio
    from pyppeteer import launch
    
    url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"
    
    async def get_names(link):
        wb = await launch()
        page = await wb.newPage()
        await page.goto(link)
    
        containers = await page.querySelectorAll('div.v-card')
        for container in containers:
            name = await container.querySelectorEval('.business-name span','e => e.innerText')
            phone = await container.querySelectorEval('.phones','e => e.innerText')
            print(name,phone)
    
    asyncio.get_event_loop().run_until_complete(get_names(url))
    

    【讨论】:

      【解决方案2】:

      试试看:

      import asyncio
      from pyppeteer import launch
      
      url = "https://www.yellowpages.com/search?search_terms=coffee&geo_location_terms=Los%20Angeles%2C%20CA"
      
      async def get_names(link):
          wb = await launch(headless=True)
          page = await wb.newPage()
          await page.goto(link)
      
          names = await page.querySelectorAllEval('div.v-card .business-name span',
                                       '(elements => elements.map(e => e.textContent))')
          phones = await page.querySelectorAllEval('div.v-card .phones', 
                                       '(elements => elements.map(e => e.textContent))')
          result = {name: phones[idx] for (idx, name) in enumerate(names)}
          print(result)
          await wb.close()
      
      asyncio.get_event_loop().run_until_complete(get_names(url))
      

      并阅读文档:querySelectorAllEval

      【讨论】:

      • 我在执行您的脚本时收到此错误name = await container.querySelectorAllEval('.business-name span', AttributeError: 'ElementHandle' object has no attribute 'querySelectorAllEval'@Nick。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 2014-03-06
      • 2020-03-29
      • 2016-05-08
      相关资源
      最近更新 更多