利用python爬取工作报告

阅读: 评论:0

利用python爬取工作报告

利用python爬取工作报告

利用python爬取工作报告

 

在学python,记录一些学习阶段的(丑陋的)爬虫成果。

导入变量

#导入变量
import requests
from bs4 import BeautifulSoup
import time
from time import sleep
import pandas as pd
import re
import tqdm as tqdm
import os
from pandas import DataFrame
import csv

定义主要变量

#定义主要变量
headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
"content-type": "application/json; charset=UTF-8",
"Connection": "keep-alive"
}
url="/" 

根据网站报告主页找出所有报告内容的链接

def content(headers,url):#输入请求头、URLheaders = headersurl=urlcontent = (url)#requeats方法ding = 'utf8'#encoding编码content = soup = BeautifulSoup(content, 'html.parser')#借用beautifulsoup解析方式 links = soup.find_all('td', {'class', 'bl'})#这里应用的是find all方法,也可以用select ‘class’=‘bl’要注意是否是唯一对应return links#输出链接

获取每篇报告文章链接

links=content({'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',"content-type": "application/json; charset=UTF-8","Connection": "keep-alive"},"/" )
print(len(links))#这里也可以输出一个links列表

获取分支页文章内容链接,获得所有文章链接,并清洗链接格式

#获取分支页文章内容链接,获得所有文章链接,并清洗链接格式
def try_req(path):#根据网址格式定义一个获取分页的函数,如果网页有“下一页”,则_n+1,如果没有,则反馈“404”,停止循环linew=[]for i in range(1,15):#range(15)穷尽最大页数,也可以range(20)、range(100)…number=ilast='_'+str(i)newpath=str(path[:-5]+last+'.html')if (newpath))=='<Response [200]>':i=i+1linew.append(newpath)else:break   return linewclass find_all_path():#查找所有文章内容的网页链接def __init__(self):self.path = linksdef find_path(self):#清洗links,得到标准的网址格式path_list=[]headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',"content-type": "application/json; charset=UTF-8","Connection": "keep-alive"}url="/" for i in range(len(self.path)):num1=str(self.path[i]).find('href="')+8#利用str定位方法,定位唯一关键词num2=str(self.path[i]).find('.html')path= url + str(self.path[i])[num1:num2] +'.html'#截取网址path_list.append(path)return path_list#返回网址列表def all_path(self):#借助之前定义的函数获取所有文章内容(包括分页、下一页)的网址列表list2=[]for i in self.find_path():paths=try_req(i)list2.append(str(paths))return list2def clean(self):#清洗网址列表,得到格式工整的列表list3=[]for i in self.all_path():if i == '[]':passelse:list3.append(i)j0=" ".join(list3)j1 =j0.split(',')j2="".join(j1).replace('[','').replace(']','').replace("'","")j3=j2.split(' ')list_all=j3+self.find_path()return list_allif __name__ == '__main__':a = find_all_path()a.clean()#整个代码写完之后要重启变量检验一遍

获取所有报告内容的网址链接

#获取所有报告内容的网址链接
paths=a.clean()
print(paths)

抓取文章内容

#抓取文章内容
def new_content(headers,url):headers = headersurl=urlcontent = (ding = 'utf8' content = soup = BeautifulSoup(content, 'html.parser')head = str(soup.find('span', {'class', 'huang16c'}).text)#find方法找到第一个或者唯一一个&#获取文本内容text = str(soup.find('td', {'class', 'hui14_30'}).text)article=(head,text)return article#文章内容清洗
def clean_text(article):textnew1 = re.sub('([a-zA-Z*=_:;<>/%-])','', article[1])#正则表达式清洗,这一步可能会删去一些不必被删的内容,可以适当调整textnew = place('n','t').replace('楷体','').replace('年月日','').replace('u3000','').replace('"','').replace(' ','').replace('tt','t').replace('xa0','')#再次清洗text = article[0] +':'+ textnewreturn text#将政府工作报告写入文件
def writing(paths):for k,i in enumerate(paths):time.sleep(1)text1=clean_text(new_content(headers,i))text=str(i)+'n'+text1text2=text1[:text.find(':')][:4]with open('/Users/yunjiefei/Desktop/new/'+text2+'_'+str(k)+'.txt', 'w', encoding = 'utf-8') as f:#为了防止重复命名,命名方式略微丑陋。也可以采取网址命名方式。f.write(text)#print(k)#进度可视化
#得到一个文件名为年份(+一个为了防止重复命名的无意义的总序号),文件内容为网址+标题+内容的报告集合

执行写入

#执行写入
writing(paths)

将我们的文件写入数据框内

#将我们的文件写入数据框内
file_name = os.listdir(r'/Users/yunjiefei/Desktop/new')
li=[]
li_all=[]
for i in file_name[120:185]:#分次截取列表,要不然会报错,内存超载time.sleep(1)files= open(r'/Users/yunjiefei/Desktop/new'+'/'+i,'r',encoding='utf8',errors='ignore')#会有一个macos的隐藏文件,忽略它filereader&#ad()filecontent=filereader[filereader.find('年政府工作报告:')+9:]filelink=filereader[:filereader.find('.html')+5]filetitle=str(i)[:4]+'年政府工作报告'li=[i,filecontent,filelink,filetitle]li_all.append(li)
print(li_all)#构造双层列表

写入数据框并保存

#写入数据框并保存
data=pd.DataFrame(li_all,columns = ["filename","content",'link','title'])
#data2=pd.DataFrame(li_all,columns = ["filename","content",'link','title'])#根据分割的数据分别保存进dataframe
#data3=pd.DataFrame(li_all,columns = ["filename","content",'link','title'])
#data4=pd.DataFrame(li_all,columns = ["filename","content",'link','title'])
data_all=data.append([data2,data3,data4])#append直接纵向合并
data_all.index=data_all['filename']
del data_all['filename']
_excel('/Users/yunjiefei/Desktop/reports.xlsx')#最后将整体的政府工作报告保存入文件
#后续利用excel根据需要整理表格即可

数据展示 

本文发布于:2024-02-02 10:28:16,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170684089343197.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:【头歌
标签:工作报告   python
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23