python web抓取数据到csv

Posted

技术标签:

【中文标题】python web抓取数据到csv【英文标题】:python web scraping data to csv 【发布时间】:2022-01-24 03:50:09 【问题描述】:

我尝试使用 python 网页抓取然后输出一个 csv 文件,但打印格式与 csv 格式不匹配。

输出enter image description here

如何打印这个预期结果? enter image description here

谢谢

下面是我的脚本

import urllib.request as req
import bs4
import csv
import pandas as pd
import re
from datetime import date, timedelta

def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2021, 12, 10)
end_date = date(2021, 12, 15)
url="https://hkgoldprice.com/history/"

with open('gprice.csv','w',newline="") as f1:
    for single_date in daterange(start_date, end_date):
        udate = single_date.strftime("%Y/%m/%d")
        urld = url + single_date.strftime("%Y/%m/%d")
        writer=csv.writer(f1,delimiter = '\t',lineterminator='\n',)
        writer.writerows(udate)

        print(udate)
        with req.urlopen(urld) as response:
            data=response.read().decode("utf-8")
            root=bs4.BeautifulSoup(data, "html.parser")
            prices=root.find_all("div",class_="gp")
            gshops=root.find_all("div",class_="gshop")
            gpdate=root.find_all("div",class_="gp_date")
            for price in prices:
                print(price.text)
                row = price
                writer.writerows(row)

【问题讨论】:

【参考方案1】:

第一个问题是你使用“writerows”,它会导致 csv 写入尽可能多的行。所以当你的文本是“2021/12/23”时,转换器会变成['2', '0', '2', '1', '/', '1', '2', '/', '2', '3'],每行写一个字符。和价格一样的问题。因此我们使用“writerow”并将行数据保存为列表,以防止 csv 将我们的数据转换为多行。

第二个是在 BeautifulSoup 中使用.text 将记录所有文本,包括空格和导致 csv 行为不可预测。所以我会先把所有的空格和#删除,防止出现这种情况。

这是修改后的代码

with open('gprice.csv','w',newline="") as f1:
    for single_date in daterange(start_date, end_date):
        udate = single_date.strftime("%Y/%m/%d")
        urld = url + single_date.strftime("%Y/%m/%d")
        #we will append row by row, so we just use default setting on csv write
        writer=csv.writer(f1)
        #define empty row list
        row_list = []
        #append datetime
        row_list.append(udate)
    
        with req.urlopen(urld) as response:
            data=response.read().decode("utf-8")
            root=bs4.BeautifulSoup(data, "html.parser")
            prices=root.find_all("div",class_="gp")
            gshops=root.find_all("div",class_="gshop")
            gpdate=root.find_all("div",class_="gp_date")
            for price in prices:
                #get inner text and delete '#'
                row = price.text.replace('#', '')
                #delete all whitespaces and append price
                row_list.append("".join(row.split()))
        #we only append one row data, so use "writerow" instad of "writerows"
        writer.writerow(row_list)

【讨论】:

以上是关于python web抓取数据到csv的主要内容,如果未能解决你的问题,请参考以下文章

python web抓取并将数据写入csv

如何将抓取的 Web 数据保存到多个 csv 文件中

抓取:将存储为图片的数据添加到 python 3.5 中的 CSV 文件

使用循环进行 Web 抓取并写入 csv

如何将抓取数据保存到 CSV 文件中?

使用javascript呈现的内容从网页抓取数据