python - 使用循环进行网页抓取并写入 csv

标签 python pandas csv web-scraping beautifulsoup

我正在尝试从网站上的多个 URL 中抓取非结构化数据。我使用 BeautifulSoup 成功提取了我需要的 block 。然后,为了帮助构建数据集,我将这些值添加到列表中,然后再将它们写入 csv 文件。

但是,当尝试传输数据时,仅传输列表中的最后一个值。我认为这是因为每次调用循环时列表都会获取新值。如何不断向文件添加新值,以便我的 csv 文件包含每个循环中的值?谢谢。

for i in range(1, 3):
    url = "https://website.com/webid={}".format(i)
    s = session.get(url, headers=headers, cookies=cookies)
    soup = bs(s.text, 'html.parser')
    data = soup.find_all('td') 
    t = soup.find_all('td')
    a = t[0]
    b = t[1]
    c = t[2]
    info = [a, b, c]
    print(info)

df = pd.DataFrame(info)
df.to_csv('a.csv', index=False, header=False)

回应评论和其他答案:

如果我原来的代码块不清楚,我深表歉意,我试图生成最少的必要代码来解释我的情况。幸运的是@Matt_F 能够理解并引导我走向正确的方向。对于那些想要对我正在运行的代码进行更明确解释的人,请参阅下面的完整代码块(没有导入、cookie、 header 和有效负载)。

session = requests.Session()
s = session.post("https://WEBSITE.com/register?view=login&return=aW5kZXgucGhwP0l0ZW1pZD02NjM", data=payload, headers=headers, cookies=cookies)

for i in range(0,9999):
    print(i)
    # establish connection
    url = "https://WEBSITE.com/WEB-SITE/data-list?vw=detail&id={}&return=1".format(i)
    s = session.get(url, headers=headers, cookies=cookies)
    # set timer for delay
    t = time.time()
    delay = time.time() - t
    time.sleep(10*delay)
    # begin to pull data
    soup = bs(s.text, 'html.parser')
    if "Error: no data found" in s.text:
        print('skipped')
    else:
        soup.prettify()
        # print(soup)
        d = soup.find_all('td',{"valign": "top"})
        d_info = d[0:-1] 
        print(d_info)
        df1 = pd.DataFrame(d_info)
        df1t = df1.T
    
        # p = soup.find_all('p')
        # p_info = p[0:-1]
        # df2 = pd.DataFrame(p_info)
        # df2t = df2.T
    
        # result = pd.concat([df1t, df2t], axis=1, sort=False)
        df1t.to_csv('file.csv', mode='a', index=False, header=False)  

最佳答案

我相信您的问题是您正在以写入模式(默认模式)打开 csv 文件。您应该使用“a”属性以“追加”模式打开它。

df.to_csv('a.csv', mode='a', index=False, header=False)

see this thread

关于python - 使用循环进行网页抓取并写入 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62184773/

相关文章:

python - 如何使用 Pandas 基于多个字符串索引拆分列

python - 打印没有列名的 pandas df

php - CSV文件上传到php mysql数据库

python - 如何使用 Python 仅打印 csv 文件的前 10 行?

导入随机行中包含空白值的特定 CSV 文件时出现 MySQL 问题

python - 在 python 中运行管道期间访问 Apache Beam 指标值?

python - 一个模型如何通过外键与另一个模型相关联?

python - 比较 2 个列表列表的内容

python - 为 Pandas 中的列添加具有重复值的数字

python - 将列读入单独的列表中