写在前面的话:
爬虫是一个高效的信息收集手段,但同时其对服务器也会造成一定的负担,因此希望在设计爬虫脚本时,希望大家有意的增加爬虫时间间隔,维护一个良好的网络环境。
这个项目是我自己的百度AI Studio上的项目,目的是想要自己做数据库,进行法律文件的实时查询。
项目思路:
1.引用相关的包:bs4(用于规范化html文件)、urllib(用于访问服务器)、time(用于添加各种时间和等待)
2.定义文件保存函数:包含错误信息保存(用于查看哪个法律文件没有保存)、保存文件列表、保存文件。
3.获取法律文件列表,并保存
4.依据法律文件列表获取法律文件内容,并保存
项目代码:
1.引用所需要的库:
from bs4 import BeautifulSoup
from urllib import request
import time
2.定义保存相关信息的函数
# 保存页面读取错误信息
def save_ErrorData(str_error):
with open('save/record.txt',mode='a') as file:
file.write(str_error)
# 保存文件名称集合
def save_FileNames(str_FileName):
with open('save/filenames.txt',mode='a') as file:
file.write(str_FileName)
# 保存相关文件内容
def save_File(str_FileName,str_FileData):
with open('save/'+str_FileName+'.txt',mode='w',encoding='utf-8') as file:
file.write(str_FileData)
3.定义被爬取网站的基础网址
str_URL_base='http://www.npc.gov.cn/'
4.爬取第一个页面,主要用于测试代码
str_URL='http://www.npc.gov.cn/npc/c12488/list.shtml'
req = request.Request(url=str_URL)
print(req)
res = request.urlopen(req).read()
soup=BeautifulSoup(res,'html.parser')
# print(soup)
soup_clist=soup.find_all(name='ul',class_='clist')
print('-----------------------------------------------------')
# print(soup_clist)
if(soup_clist==[]):
save_ErrorData('not save layer no:'+str(0)+'\n')
print('error occured:0')
else:
for temp in soup_clist:
soup_clist_a=temp.find_all(name='a')
for temp_1 in soup_clist_a:
print(temp_1['href'],temp_1.string)
save_FileNames(temp_1.string+'---'+'http://www.npc.gov.cn'+temp_1['href']+'\n')
5.爬取其他法律列表页面,获取所有法律文件标题和URL。一定要添加time.sleep(),已减小服务器负担。
for i in range(2,16,1):
temp_strURL='http://www.npc.gov.cn/npc/c12488/list_'+str(i)+'.shtml'
req = request.Request(url=temp_strURL)
res = request.urlopen(req).read()
soup = BeautifulSoup(res, 'html.parser')
soup_clist = soup.find_all(name='ul', class_='clist')
# print(soup_clist)
if (soup_clist == []):
save_ErrorData('not save layer no:' + str(0) + '\n')
print('error occured:'+str(i))
else:
for temp in soup_clist:
soup_clist_a = temp.find_all(name='a')
for temp_1 in soup_clist_a:
print(temp_1['href'], temp_1.string)
save_FileNames(temp_1.string + '---' + 'http://www.npc.gov.cn/' + temp_1['href'] + '\n')
time.sleep(3) #睡眠3秒,以防过度爬取导致他人访问网站堵塞
6.访问各个法律文件所在网址,保存各个法律文件。一定要添加time.sleep(),已减小服务器负担。
with open('save/filenames.txt','r',encoding='utf-8') as file_temp:
info_list=file_temp.readlines()
# print(info_list)
for info_temp in info_list:
name,url=info_temp.split('---')
print(name,url)
try:
req = request.Request(url=url)
res = request.urlopen(req).read()
soup=BeautifulSoup(res,'html.parser')
# print(soup)
div=soup.find('div',id='Zoom')
# print(div)
except BaseException as e:
print('error occur:', e)
save_ErrorData(time.strftime('%Y%m%d%H%M%S') + '未获取文件:' + name + '。error detail:' + str(e) + '\n')
try:
str_content=div.get_text()
# print(str_content)
save_File(name,str_content)
except BaseException as e:
print('error occur:',e)
save_ErrorData(time.strftime('%Y%m%d%H%M%S')+'未获取文件:'+name+'。error detail:'+str(e)+'\n')
time.sleep(2)