Python爬虫实例-爬取网站的备案信息

第一步:

分析站长工具网页内容

从页面内容看:我们要想查询每个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网页等。作为新手练习。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180520G1BPT100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券