代码练习:
from selenium import webdriver#引进selinium库
import time
import re#引入re库
#定义函数
def cninfo(keyword):
#selenium库模拟浏览器
url='http://www.cninfo.com.cn/new/fulltextSearch?notautosubmit=&keyWord='+keyword#找规律,定义网址
chrome_options=webdriver.ChromeOptions()#定义chrome_options执行打开谷歌浏览器
chrome_options.add_argument('--headless')#添加启动参数 (add_argument),chrome_options添加--headless启动参数(作用:无界面运行(无窗口))
browser=webdriver.Chrome(options=chrome_options)#定义浏览器命令browser执行chrome_options命令
browser.get(url)#browser执行浏览器获取网址命令
time.sleep(5)#时间库执行停顿5秒
data=browser.page_source#定义data,执行浏览器获取源码命令
#p_count='<span class="total-box" style="">共 (.*?) 条 当前显示1-10条</span>'#定义p_count,提取公告总数
#count=re.findall(p_count,data)[0]#把提取的公告总数赋予count,此处用findall()得到的是一个列表,所以要加[0],提取元素
#pages=int(int(count)/10) # 通过公式得到页数,先把findall()得到的数据转为整型,再把进行运算后的数据去小数转换为整数
datas=[]#创建一个新列表datas,来装全部源码数据
datas.append(data)#把获取的第一页源代码储存到datas列表中
for i in range(3):#这里运行快取4页爬取,实操range(pages)
browser.find_element_by_xpath('//*[@id="fulltext-search"]/div/div/div[2]/div[4]/div[2]/div/button[2]').click()#遍历页数点击下一页
time.sleep(2)#防止页面没有加载完成,停顿2秒
data=browser.page_source#每点击一次,获取一次源码
datas.append(data)#把每次的源码加入datas列表中
time.sleep(1)#防止页面没有加载完成,停顿1秒
alldata=''.join(datas)#把装有全部源码的列表转化为字符串
browser.quit() # 关闭模拟浏览器
#正则提取内容
p_title = '<span title="" class="r-title">(.*?)</span>'#提取标题
p_href = '<a target="_blank" href="(.*?)" data-id=".*?" data-orgid=.*?" data-seccode=".*?" class="ahover">'#提取网址
p_date = '<td rowspan="1" colspan="1" class="el-table_1_column_3 is-left "><div class="cell"><span class="time">(.*?)</span>'#提取时间
title = re.findall(p_title,alldata,re.S)#使用re.S,将“\n”当做一个普通的字符,在整体中进行匹配
href = re.findall(p_href,alldata)#不使用re.S参数,只在每一行内进行匹配,如果一行没有,就换下一行重新开始
date = re.findall(p_date,alldata,re.S)
# print(title)#通过观察需要清除<>内容
# print(href)#通过观察,网址需要加前缀http: // www.cninfo.com.cn /,去掉文中amp;
# print(date)#通过观察,日期需要清除换行符,空格以及部分带时间的格式
#遍历标题清洗数据
for i in range(len(title)):
title[i]=re.sub('<.*?>', '', title[i])#清理title里多余的<>内容
href[i]='http://www.cninfo.com.cn' + href[i]#加网络前缀
href[i]=re.sub('amp;', '', href[i])#提取的网址多出的amp;清理掉
date[i]=date[i].strip()#提取的日期,清除换行符,空格以及部分带时间的格式
date[i]=date[i].split(' ')[0]#以空格为分隔符,取第一个元素日期
# 自动筛选内容
if '2022'in date[i]:#保留2022年的内容
title[i]=title[i]
href[i]=href[i]
date[i]=date[i]
else:#其余内容转空值
title[i]=''
href[i] =''
date[i] =''
#清除空值
while '' in title:
title.remove('')
while '' in href:
href.remove('')
while '' in date:
date.remove('')
#在筛选内容后打印出数据
for i in range(len(title)):
print(str(i + 1) + '.' + title[i] + '-' + date[i])
print(href[i])
#批量自动下载pdf文件
for i in range(len(href)):
#定义模拟浏览器
chrome_options = webdriver.ChromeOptions() #chromeOptions 是一个配置 chrome 启动是属性的类,定义chrome_options执行webdriver打开谷歌模拟浏览器
prefs={'profile.default_content_settings.popups':0,'download.default_directory':'F:\\05pycharm\\20220227学习\\00chrome文件下载'}#为chrome配置如下参数:定义文件夹名字使用默认,下载目录定义f:里某文件夹
chrome_options.add_experimental_option('prefs',prefs) # 添加实验性质的设置参数 (add_experimental_option)
browser = webdriver.Chrome(options=chrome_options) # 定义浏览器命令browser执行chrome_options相关参数
browser.get(href[i])#获取网址
try:#遍历网址执行点击下载pdf按钮
browser.find_element_by_xpath('//*[@id="noticeDetail"]/div/div[1]/div[3]/div[1]/button').click()
time.sleep(5)
print(str(i + 1) + '.' + title[i] + '下载完毕')
browser.quit()
except:#否则输出文件不是pdf
print(title[i]+'不是pdf')
#调用自定义函数
keywords=['纾困']
for i in keywords:
cninfo(i)
运行结果: