【问题标题】:Pass url column's values one by one to web crawler code in Python将 url 列的值一一传递给 Python 中的网络爬虫代码
【发布时间】:2021-03-31 15:15:55
【问题描述】:

根据this link 的回答代码,我可以创建一个新列:df['url'] = 'https://www.cspea.com.cn/list/c01/' + df['projectCode']

下一步我想将url 列的值传递给以下代码,并将所有抓取的内容附加为数据框。

import urllib3
import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.cspea.com.cn/list/c01/gr2021bj1000186" # url column's values should be passed here one by one
soup = BeautifulSoup(requests.get(url, verify=False).content, "html.parser")
index, data = [], []
for th in soup.select(".project-detail-left th"):
    h = th.get_text(strip=True)
    t = th.find_next("td").get_text(strip=True)
    index.append(h)
    data.append(t)

df = pd.DataFrame(data, index=index, columns=["value"])
print(df) 

我如何在 Python 中做到这一点?谢谢。

更新:

import requests
from bs4 import BeautifulSoup
import pandas as pd

df = pd.read_excel('items_scraped.xlsx')

data = []
urls =  df.url.tolist()
for url_link in urls:

    url = url_link
    # url = "https://www.cspea.com.cn/list/c01/gr2021bj1000186"
    soup = BeautifulSoup(requests.get(url, verify=False).content, "html.parser")
    
    index, data = [], []
    for th in soup.select(".project-detail-left th"):
        h = th.get_text(strip=True)
        t = th.find_next("td").get_text(strip=True)
        index.append(h)
        data.append(t)
    
    df = pd.DataFrame(data, index=index, columns=["value"])
    df = df.T
    df.reset_index(drop=True, inplace=True)
    print(df)

df.to_excel('result.xlsx', index = False)

但它只将一行保存到excel文件中。

【问题讨论】:

  • 假设您的其余代码是正确的,您需要将循环内的 df 附加到全局列表,然后在循环外的该列表上调用 pd.concat。目前,您只在每次覆盖 df 时使用最后一次迭代。有很多现有的问题涵盖了这一点,
  • 对不起,我不明白,你能编辑我的代码吗?

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


【解决方案1】:

需要结合循环中生成的dfs。您可以将它们添加到列表中,然后在该列表中调用pd.concat

import requests
from bs4 import BeautifulSoup
import pandas as pd

df = pd.read_excel('items_scraped.xlsx')

# data = []
urls =  df.url.tolist()
dfs = []

for url_link in urls:

    url = url_link
    # url = "https://www.cspea.com.cn/list/c01/gr2021bj1000186"
    soup = BeautifulSoup(requests.get(url, verify=False).content, "html.parser")
    
    index, data = [], []
    for th in soup.select(".project-detail-left th"):
        h = th.get_text(strip=True)
        t = th.find_next("td").get_text(strip=True)
        index.append(h)
        data.append(t)
    
    df = pd.DataFrame(data, index=index, columns=["value"])
    df = df.T
    df.reset_index(drop=True, inplace=True)
    print(df)
    dfs.append(df)

df = pd.concat(dfs)
df.to_excel('result.xlsx', index = False)

【讨论】:

  • 你认为data = [] out of loop 有必要吗?因为我在循环代码中找到了index, data = [], []
  • 我保留了该代码原样。我无法运行整个过程,因为您发布的链接(我假设它生成了 xlsx 数据)对我不起作用。数据看起来需要在循环中,因为它用于生成单独的 df。
  • 很抱歉给您带来不便。即使我评论了data = [],我发现它也能正常工作。感谢您的帮助。
【解决方案2】:

使用

 urls =  df.url.tolist()

创建一个 URL 列表,然后使用 f 字符串遍历它们以将每个 URL 插入到您的基本 URL 中

【讨论】:

  • 谢谢,我更新了我的问题,它只保存了一行。请检查。
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多