HTML:超文本标记语言,编写网页时最基本最核心的语言,用不同的标签对网页上的不同内容进行标记,从而使网页显示不同的展示效果。
bs4:首先将页面源码加载到BeautifulSoup实例对象中,然后调用BeautifulSoup中对象相关的属性和方法进行标签定位和数据提取
如果没有安装这个库,可以在终端运行命令:pip install bs4
在某平台,提取农产品最新价格播报的数据,包括农产品名称、当前的单位价格、批发市场、价格日期四个信息,并以CSV格式输出
如果从大方向来说,只需两步:先拿到页面源代码,然后用bs4解析,就能拿到数据。
首先获得网页的URL,再用requests模块的get请求,获得源代码并打开网页。在这里笔者并没有使用headers
进行浏览器伪装,但依旧获取了网页内容,可见网站并没有设置反爬机制。但即便如此,也请大家自觉遵守爬虫的规制,仅用于学习且不影响其服务器正常运行的爬虫使用。
在获得数据后,我们打开网页的源代码观察一下。
我们要获取“最新价格播报”中农产品的相关数据。这里选择table
且后面的class="table-01 z-style1"
限制了我们要获取对象的范围,分别是标签和属性。
此外,table
在 html 中是作为表格形式的存在。tr
表示行,td
表示列。我们要找的数据是这些行和列中的数据,所以在代码中将会以索引的方式呈现。
最后将其遍历,使用 csv_write 就可以将数据以CSV格式输出。
from bs4 import BeautifulSoup
import requests
import csv
# 获取源代码
url = "http://nc.mofcom.gov.cn/jghq/index"
resp = requests.get(url)
# 以写入的方式打开文件
f = open("农产品价格.csv", mode="w")
csv_write = csv.writer(f)
# 指定html解析器,交给bs4处理
page = BeautifulSoup(resp.text,"html.parser")
# 指定标签和属性,从对象中查找数据
table = page.find("table",attrs={"class":"table-01 z-style1"})
# 拿到所有的数据行
trs = table.findAll("tr")
# 遍历每一行
for tr in trs:
# 拿到每一行的所有td(列)
tds = tr.find_all("td")
# 所有被标签标记的内容
name = tds[0].text
price = tds[1].text
place = tds[2].text
date = tds[3].text
csv_write.writerow([name,price,place,date])
print("抓取成功!!!")
# 关闭文件,关闭访问请求
f.close()
resp.close()