【问题标题】:Reading list of URLs from .csv for scraping with Python, BeautifulSoup, Pandas从 .csv 中读取 URL 列表以使用 Python、BeautifulSoup、Pandas 进行抓取
【发布时间】:2022-01-05 09:04:57
【问题描述】:

这是另一个问题 (Reading URLs from .csv and appending scrape results below previous with Python, BeautifulSoup, Pandas) 的一部分,@HedgeHog 慷慨回答,@QHarr 提供了帮助。现在将此部分作为一个单独的问题发布。

在下面的代码中,我将 3 个示例源 URL 粘贴到代码中,它可以工作。但是我有一长串要抓取的 URL(1000+),它们存储在 .csv 文件的第一列中(我们称之为“urls.csv”)。我宁愿直接从该文件中读取。

我想我知道“with open”的基本结构(例如@bguest 在下面回答它的方式),但我在如何将其链接到其余代码时遇到问题,以便其余部分继续工作.如何用 .csv 的迭代读取替换 URL 列表,以便将 URL 正确传递到代码中?

import requests
from bs4 import BeautifulSoup
import pandas as pd

urls = ['https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Induction-Hobs-30196623/',
        'https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Human-Capital-Management-30196628/',
        'https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Probe-Card-30196643/']
data = []

for url in urls:
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')
    toc = soup.find("div", id="toc")


    def get_drivers():
        data.append({
            'url': url,
            'type': 'driver',
            'list': [x.get_text(strip=True) for x in toc.select('li:-soup-contains-own("Market drivers") li')]
        })


    get_drivers()


    def get_challenges():
        data.append({
            'url': url,
            'type': 'challenges',
            'list': [x.get_text(strip=True) for x in toc.select('li:-soup-contains-own("Market challenges") ul li') if
                     'Table Impact of drivers and challenges' not in x.get_text(strip=True)]
        })


    get_challenges()

pd.concat([pd.DataFrame(data)[['url', 'type']], pd.DataFrame(pd.DataFrame(data).list.tolist())],
          axis=1).to_csv('output.csv')

【问题讨论】:

  • 你的意思是with open(...
  • edit您的问题并准确发布您的具体问题,作为一个单一的询问声明。不要依赖其他问题中的信息,因为有关 Stack Overflow 的问题必须是独立的。包括指向其他​​问题的链接仅供参考。一旦你提出了你的问题,请在代码中发布minimal reproducible example,清楚地展示你的问题,以及到目前为止你为解决它所做的努力。如果您的问题只是如何从 CSV 中读取 URL 列表?,请搜索更多答案,因为该网站已多次解决。
  • @MattDMo,谢谢你的笔记。确实没有必要为此阅读另一个问题,但我想认识到其他人在到达这个地方的作用 - 引用的代码显然不是我的全部。我认为展示我到目前为止所做的尝试只会让人感到困惑,因为它显然不起作用——我错过了将 csv 的读取与其余部分联系起来的步骤,并且显示两个不兼容的代码将无济于事。对不起,如果我对规则的理解非常“新手”。

标签: python pandas web-scraping beautifulsoup import-from-csv


【解决方案1】:

由于您使用的是 pandas,read_csv 将为您解决问题:https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

如果你想自己写,你可以使用内置的 csv 库

import csv

with open('urls.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print(row["url"])

编辑:被问及如何让其余代码使用 csv 中的 url。

首先将网址放入 urls.csv 文件中

url
https://www.google.com
https://www.facebook.com

现在从 csv 中收集 url

import csv

with open('urls.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)

    urls = [row["url"] for row in reader]

# remove the following lines
urls = ['https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Induction-Hobs-30196623/',
        'https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Human-Capital-Management-30196628/',
        'https://www.marketresearch.com/Infiniti-Research-Limited-v2680/Global-Probe-Card-30196643/']

现在剩下的代码应该使用这些网址

【讨论】:

  • 非常感谢您。我想我需要导入csv。现在,我的问题实际上是如何使用在其余代码中读取的内容。在这个阶段我没有打印它,而是将 url 一个一个地传递给其余的代码。我的问题主要是不知道如何让其余的代码使用这些 url 并使用它们。你有什么建议给我吗?
  • 在我的回答中回答你的问题,给我几分钟
  • 非常感谢。实现您的代码后,我仍然有两个小难题: data=[] 到底应该去哪里,以及最后的 pd.concat 是否应该以缩进开头。好吧,我尝试了大约 6 种组合中的每一种,我发现它与 data=[] 完美配合,就在“for url in urls:”之前,并且最后一行没有缩进(但在我的所有其他代码中又多了一个缩进)。所以非常感谢!我真正缺少的是这部分“urls = [row [“url”] for row in reader]”——基本上是 csv 输入和其余代码之间的转换!
  • data=[] 应该放在 for 循环的开头,如果您保持代码原样,这样您就不会添加之前已经添加的数据
猜你喜欢
  • 2022-01-04
  • 2020-09-02
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多