文章直通车
- 目标网址
- 获取要求
- 保存形式
- 获取分析
- 代码及主要注释
- csv文件用excel打开问题
目标网址:http://czt.zj.gov.cn/col/col1164176/index.html
获取要求:获取每一条政策上的标题、政策文号、发布日期、发布机构以及发布的内容
保存形式:保存为csv文件,用excel打开形如:
分析:首先,我们需要获取每个政策的url,也就是li标签里面a标签的href属性值
然后根据获取的url去获取所需要的内容:
最后保存为csv文件
代码及主要注释:
import requests
import re
from lxml import etree
import csv
# 通篇没有使用面向对象,因为个人觉得这样学习
column_name = ['title', 'ref_no', 'published_day', 'department', 'url', 'content']
with open('财政政策.csv', 'w', newline='') as f:
csv_f = csv.writer(f)
csv_f.writerow(column_name)
url = 'http://czt.zj.gov.cn/col/col1164176/index.html'
# 爬取第1页的数据,如若想要爬取多页的数据,可以用for循环并更改pageNum参数
params = {
'uid': '5488355',
'pageNum': 1
}
# 使用正则表达式匹配政策url的后半部分以构建url
response = requests.get(url, params=params).text
pat = '<a href="(.*?)"'
result = re.findall(pat, response, re.S)
# 从匹配的第7条数据开始,共15个,此后的是下一页的几条数据
for link in result[7:22]:
content_url = f'http://czt.zj.gov.cn{link}'
# print(content_url) 政策内容的url
resp = requests.get(content_url).content.decode('utf-8')
html = etree.HTML(resp)
title = html.xpath('//div[@class="art_title"]/h2/text()')
# print(title) 政策的标题
ref_no = html.xpath('//div[@id="zoom"]//p[@style="text-align: center;"][1]/text()')
# 因为HTML格式有所变换,所以有一个匹配到空格,便做了以下判断
if ref_no[0].isspace():
ref = html.xpath('//div[@id="zoom"]/p[2]/span/text()')
ref_no = ''.join(ref).split()
# 其中一个匹配到其他内容,所以做了以下判断
keyword = '号'
if keyword not in ref_no[0]:
ref_no = html.xpath('//div[@id="zoom"]/p[2]/text()')
# print(ref_no) 政策文号
published_day = html.xpath('//div[@class="fz_xx"]/span/text()')[0][5:]
# print(published_day) 政策发布日期
department = html.xpath('//div[@class="fz_xx"]/span/text()')[3]
# print(department) 政策发布机构
content_list = html.xpath('//div[@id="zoom"]/p/text()')
mark = '(换行)'
content = mark.join(content_list).replace(' ', '')
# print(content) 政策发布内容
row_con = [f"{title[0]}", f"{ref_no[0]}", f"{published_day}", f"{department}", f"{content_url}", f"{content}"]
with open('财政政策.csv', 'a', encoding='utf-8-sig', newline='') as f:
csv_f = csv.writer(f)
csv_f.writerow(row_con)
print('success')
csv文件用excel打开问题:
最后在用excel打开的时候你可能会发现乱码,像这样:
就先以记事本形式打开
再点击文件另存为(也可以改掉编码为ANSI)
最终用excel打开就没有乱码了
也许你还可能发现发布日期为######,是因为列宽不够,增加列宽就可以啦