一点爬虫的心得体会——从一碗漂亮的汤的开始
python的beautifulsoup4能够完成一些比较基本的网页爬取功能,通过它可以较为容易、方便地获取一些数据。
这里我们以招商银行的美元兑人民币汇率为例(网址:
)
网页部分内容如上图,我们需要获取它的第一列和第二列的数据。可以看到它是分页的,每页有条数限制。
我们通过开发者工具(一般来说为浏览器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"]))
- 点赞
- 收藏
- 关注作者
评论(0)