一点爬虫的心得体会——从一碗漂亮的汤的开始

举报
yd_241343919 发表于 2023/10/11 11:15:07 2023/10/11
【摘要】 python的beautifulsoup4能够完成一些比较基本的网页爬取功能,通过它可以较为容易、方便地获取一些数据。这里我们以招商银行的美元兑人民币汇率为例(网址:https://fx.cmbchina.com/Hq/History.aspx?nbr=%e7%be%8e%e5%85%83&startdate=2019-05-01&enddate=2023-06-30&page=1)网页部分...

python的beautifulsoup4能够完成一些比较基本的网页爬取功能,通过它可以较为容易、方便地获取一些数据。

这里我们以招商银行的美元兑人民币汇率为例(网址:

https://fx.cmbchina.com/Hq/History.aspx?nbr=%e7%be%8e%e5%85%83&startdate=2019-05-01&enddate=2023-06-30&page=1

网页部分内容如上图,我们需要获取它的第一列和第二列的数据。可以看到它是分页的,每页有条数限制。

我们通过开发者工具(一般来说为浏览器F12),通过观察网页内容,可以得知其表格对应的内容如下:

非常幸运,这个页面只有这一个表格,包括一个表头(tr)和表的内容(tbody)。

其每一行的内容如下:

到此,我们大致明白了这个网站的结构,接下来可以写代码了。

首先是一些固定的表头:

 headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62'
    }
    url_base = "http://fx.cmbchina.com/Hq/History.aspx?nbr=%e7%be%8e%e5%85%83&startdate=2023-07-01&enddate=2023-08-31&page="
    data_bank = []

其中url_base是我们要获取网站的主体内容,page留空(循环变量补充),data_bank用于保存获取信息。

        url = url_base + str(page)
        r = requests.get(url, timeout=30, headers=headers)
        r.raise_for_status()
        r.endcodding = 'utf-8'
        soups = BeautifulSoup(r.text.replace("\r","").replace("\n",""))
        p_nodes = soups.find_all(name="tr")
        i = 0
        for p_node in p_nodes:
            i = i + 1
            if i == 1:
                continue;
            data_Dict = {}
            data_Dict["date"] = p_node.find(name = "td", align = "center").get_text()
            data_Dict["price"] = p_node.find(name = "td", class_ = "numberright").get_text()
            data_bank.append(data_Dict)
        time.sleep(1)

这里是一个循环的内容,我们逐个解释。

在拼好完整的网页(第一行)后,用requests.get()来获取网页内容。如果出现连接错误、拒绝访问等异常情况,它还是会返回一些内容,所以需要raise_for_status判断网站是否是正常页面。

在这些之后,我们可以使用beautifulsoup来组织并搜索所有的“tr”(看上文,一个tr就是一列)。

第一行的内容是固定的表头,所以我们去掉第一行的tr,从第二行开始爬取。

对于每一行,有5个td,我们只要第一个(日期)和第二个(汇买价),保存这两个即可。

最后,为了减少对服务器的压力(和一定程度上避免被对方服务器反爬),每次爬取之后最好暂停一下。

通过这样的过程,我们完成了一页的爬取。在爬取所有内容之后,我们可以保存到.csv文件里:

with open("Bank_price.csv", 'w', encoding = "UTF-8") as f:
        i=0
        f.write('{},{}\n'.format(
                    "日期",'价格'))
        for d_b in data_bank:
            i=i+1
            f.write('{},{}\n'.format(
                    d_b["date"], d_b["price"]))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。