【问题标题】:How do I simultaneously scrape two pages and produce two distinct lists within one nested 'for-loop'?如何同时抓取两页并在一个嵌套的“for-loop”中生成两个不同的列表?
【发布时间】:2017-09-21 12:47:34
【问题描述】:

我正在从具有相同 DOM 结构的两个 URL 中进行抓取,因此我试图找到一种同时抓取它们的方法。
唯一需要注意的是,从这两个页面中抓取的数据需要最终出现在明确命名的列表中。

用例子来解释,这是我尝试过的:

import os
import requests
from bs4 import BeautifulSoup as bs


urls = ['https://www.basketball-reference.com/leaders/ws_career.html',
       'https://www.basketball-reference.com/leaders/ws_per_48_career.html',]

ws_list = []
ws48_list = []

categories = [ws_list, ws48_list]

for url in urls:
    response = requests.get(url, headers=headers)
    soup = bs(response.content, 'html.parser')
    section = soup.find('table', class_='stats_table')
    for a in section.find_all('a'):
        player_name = a.text
        for cat_list in categories:
            cat_list.append(player_name)
print(ws48_list)
print(ws_list)

当我为其页面拍摄 2 个独特的列表时,这最终会打印两个相同的列表。
我该如何做到这一点?以另一种方式编码会更好吗?

【问题讨论】:

  • 您正在为两个列表添加相同的项目player_name
  • 请查看我更新后的评论。我错过了某个部分。
  • @offeltoffel 每次迭代我如何区分这两个页面?
  • 我正准备用enumerate 给你一个解决方案,但用户Uvar 更快。 enumerate 允许您迭代项目并同时计算它们的数量。您通过url 处理该项目并将其分配给您的类别索引i

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


【解决方案1】:

而不是尝试追加到已经存在的列表。只需创建新的。制作一个函数来执行抓取并将每个 url 依次传递给它。

import os
import requests
from bs4 import BeautifulSoup as bs

urls = ['https://www.basketball-reference.com/leaders/ws_career.html',
       'https://www.basketball-reference.com/leaders/ws_per_48_career.html',]

def parse_page(url, headers={}):

    response = requests.get(url, headers=headers)
    soup = bs(response.content, 'html.parser')
    section = soup.find('table', class_='stats_table')
    return [a.text for a in section.find_all('a')]


ws_list, ws48_list = [parse_page(url) for url in urls]

print('ws_list = %r' % ws_list)
print('ws8_list = %r' % ws48_list)

【讨论】:

    【解决方案2】:

    只需将它们添加到适当的列表中,问题就解决了吗?

    for i, url in enumerate(urls):
        response = requests.get(url)
        soup = bs(response.content, 'html.parser')
        section = soup.find('table', class_='stats_table')
        for a in section.find_all('a'):
            player_name = a.text
            categories[i].append(player_name)
    print(ws48_list)
    print(ws_list)
    

    【讨论】:

      【解决方案3】:

      您可以使用一个函数来定义您的抓取逻辑,然后为您的网址调用它。

      import os
      import requests
      from bs4 import BeautifulSoup as bs
      
      def scrape(url):    
          response = requests.get(url)
          soup = bs(response.content, 'html.parser')
          section = soup.find('table', class_='stats_table')
          names = []
          for a in section.find_all('a'):
              player_name = a.text
              names.append(player_name)
          return names    
      
      ws_list = scrape('https://www.basketball-reference.com/leaders/ws_career.html')
      ws48_list = scrape('https://www.basketball-reference.com/leaders/ws_per_48_career.html')
      
      print(ws_list)
      print(ws48_list)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2015-07-07
        • 2023-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多