第一步:
分析站长工具网页内容
从页面内容看:我们要想查询每个URL的备案信息只需要构造一个如图中屎黄色的URL=’http://icp.chinaz.com/?s=%s’ % url。我们主要获取页面中'主办单位名称','主办单位性质','网站备案/许可证号','网站名称','网站首页网址', '审核时间'这几个信息就足够了。
2.查看网页源代码
从源代码可以看到:
和
是我们要找的标签,所以可以用BeautifulSoup库来解析网页获取标签相应内容。下面通过两种方式获取我们想要的网页信息。
获取
信息1:
info = soup.find_all('li', attrs={'class':'bg-gray clearfix'})
print(info)
结果:
获取
信息:
info = soup.find_all('li', attrs={'class':'clearfix'})
print(info)
结果:
从上面两个图可以看到用
标签查找时直接找到所有我们想要的信息,但是也有一些不是我们需要的得做一下特别处理。如果我们网址不合法或者没有备案则网页源代码是没有
标签,解析时查找信息就为空。
下面是获取我们想要的信息的函数:
def get_url_info(url):
res = [] # 存储我们获取到的网页信息
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
print("获取网页地址失败!")
htmltext = r.text
soup = BeautifulSoup(htmltext, 'html.parser') # 解析html
info = soup.find_all('li', attrs={'class':'clearfix'})# 查找对应的标签信息
if info: # 查找的网页有备案信息时执行下面获取信息
temp_info = []
temp_info.append(url.split('=')[-1])
for item in info[:-1]:
if item.p.text:
temp_info.append(re.sub('[使用高级查询纠正信息|查看截图]','',item.p.text)) # 只保留我们想要的信息
res.extend(temp_info)
else:
res.extend([url.split('=')[-1],"无备案信息"]) # 没有备案时标注
return res
3.存入CSV文件
获取的数据以列表的形式存储,我们要存储在文件方便查看。
代码:
def writeCSV(data_list, filename):
with open(filename, 'w', newline='') as f:# newline=''表示存储当前行换行下一行,不然CSV存储文件会有多一行空行。
f_csv = csv.writer(f)
for item in data_list:
f_csv.writerow(item) # 一次写入一行。
4.我的URL网址存储在CSV文件,我们需要读取出来然后然后对每一个URL执行获取备案信息的函数。
网页文件格式:
注:因为是练手随表写了几个网址,包含合法和非法地址。
读取URL:
def get_url(filename, header=False):
res_data = []
f = open(filename, 'r')
while True:
line = f.readline()
if header:
header = False
continue
if line:
line = re.sub('[\r\n]', '', line)
res_data.append(line)
else:
break
f.close()
return res_data
5.基本的函数功能已经完全实现。第一步首先读取所有的URL存入列表,然后对每一个URL执行get_url_info(url)获取备案信息存入另一个列表,将获取的备案信息写入CSV文件。最后上完整的代码以及执行结果。
代码:
import re
import requests
import csv
from bs4 import BeautifulSoup
def writeCSV(data_list, filename):
with open(filename, 'w', newline='') as f:
f_csv = csv.writer(f)
for item in data_list:
f_csv.writerow(item)
def get_url(filename, header=True):
res_data = []
f = open(filename, 'r')
while True:
line = f.readline()
if header:
header = False
continue
if line:
line = re.sub('[\r\n]', '', line)
res_data.append(line)
else:
break
f.close()
return res_data
def get_url_info(url):
res = []
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
print("获取网页地址失败!")
htmltext = r.text
soup = BeautifulSoup(htmltext, 'html.parser')
info = soup.find_all('li', attrs={'class':'clearfix'})
if info:
temp_info = []
temp_info.append(url.split('=')[-1])
for item in info[:-1]:
if item.p.text:
temp_info.append(re.sub('[使用高级查询纠正信息|查看截图]','',item.p.text))
res.extend(temp_info)
else:
res.extend([url.split('=')[-1],"无备案信息"])
return res
def main(url_list):
res = [['URL','主办单位名称','主办单位性质','网站备案/许可证号',
'网站名称','网站首页网址', '审核时间']]
for url in url_list:
info = get_url_info(url)
res.append(info)
return res
if __name__ == '__main__':
filename = './inputdata/urls.csv'
url_list = get_url(filename, header=False)
res = main(url_list)
writeCSV(res, './outputdata/urlinfo.csv')
执行结果:
小结:本文还是比较基础的,读取网页写的比较死,不是太灵活,用到的知识点主要就是读取CSV文件,获取网页源代码,解析HMTL网页等。作为新手练习。
领取专属 10元无门槛券
私享最新 技术干货