最近导师给了一个任务:用Python爬取中国官员的官方信息,然后将信息中的关键信息(时间地点任务blablabla)抽取出来,绘制他们的关系图。
千里之行始于足下,我就从Python爬虫开始。
大致分为以下步骤:文本爬取--图片爬取--分词--信息抽取--关系网构建
一. 文本爬取(基于Python3.6):
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
from urllib import request
from bs4 import BeautifulSoup
import re
import os
url='http://cpc.people.com.cn/gbzl/flcx.html'#给出要爬取的总网址
head={}
head['User_Agent']='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6'
#设置代理,假装是用户访问. 注意,服务器会限制部分user-agent,如果程序报错,就换一个。
#user-agent的获取可参考以下网址:http://blog.csdn.net/bone_ace/article/details/52476016
req=request.Request(url,headers=head)#给请求装上代理
response=request.urlopen(url)#打开url
res=response.read().decode('UTF-8')#读取网页内容,用utf-8解码成字节
soup=BeautifulSoup(res,'lxml')#将网页的内容规范化
soup_links=soup.find('div',{'class':"p1_1 clearfix"}).find_next('div',{'class':"p1_1 clearfix"}).find_next('div',{'class':"p1_1 clearfix"})
#通过解析html,发现第3个div是我们想爬取的内容
tab=soup_links.find_all('table')#找到当前div下所有的table标签
capital=soup_links
f1=open('D:/Data_Rabbit/jianli/omit.txt','w')#打开omit文件,记录读取信息失败的官员名字
for i in range(0,len(tab)):
capital=capital.find_next('div')#找到对应的省的名字
mdir='D:/Data_Rabbit/jianli/'+capital.string+'/'
if not os.path.exists(mdir):#如果当前文件夹不存在,则创建之
os.mkdir(mdir)#新建文件夹,以省份名字命名
trs=tab[i].find_all('tr')
for trIter in trs:
tds=trIter.find_all('td')
for tdIter in tds:
file=mdir+tdIter.string+'.txt'
f=open(file,'w')#刚才创建的文件夹路径下,新建一个以领导名字命名txt文件
s=tdIter.a.get('href')#得到某领导人的链接
url_p='http://gbzl.people.com.cn/grzy.php?id='+re.findall('\d+',s)[0]#用正则表达式合成某领导人的信息网址
r0=request.urlopen(url_p)#打开某领导人信息的网页
r=r0.read().decode('UTF-8')
soup_p=BeautifulSoup(r,'lxml')
fs=soup_p.find('p',{'class':'jili'})
if fs==None:#如果读取失败
f1.write(tdIter.string+':'+url_p+'\n')#记录领导人名字和网址
else:
f.write(re.sub('\u2002','',fs.text))#记录领导人信息。忽略‘\u2002’这个字符,因为如果不这样的话,系统会报错,导致无法运行。
'''具体原因如下(百度):对于此Unicode的字符,需要print出来的话,由于本地系统是Win7中的cmd,默认codepage是CP936,即GBK的编码,
所以需要先将上述的Unicode的titleUni先编码为GBK,然后再在cmd中显示出来,然后由于titleUni中包含一些GBK中无法显示的字符,导致此时提示
“’gbk’ codec can’t encode”的错误的。'''
f.close()
f1.close()
这是我的第一个爬虫程序,在学长的指导下用时5天完成(惭愧啊...)。
之前咨询会爬虫的朋友,他说学爬虫的难点有两个:
1. 分析网址规律
2.提取要抓取的数据
我实践后的感觉是,他说得很对。上手爬虫需要有以下基础:
1.会一些基本的Python编程(事实上,只要略懂一种编程语言就可以,Python可以现学)
2.懂一点HTML的知识。这个我也是现学的,推荐一个很友好的网站:
http://www.w3school.com.cn/
3.正则表达式。这个主要用来提取自己需要的网页上的信息。这里也推荐一个网站:
http://www.runoob.com/regexp/regexp-syntax.html
其实,正则表达式如果用的不多,也可以直接百度寻找答案。
我是用python3.6实现爬虫的,用到了bs4这个库中的Beautiful Soup。通过cmd命令打开anaconda中的scripts文件夹,再输入pip install bs4 即可完成安装。当然,也可以在anaconda的界面中直接安装。
Beautiful Soup的具体用法,可以参考Beautiful Soup 的中文帮助文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/#find
(你问我为啥知道这么多网站,当然是因为我啥都不会,都需要参考啊~~~)
在上面的代码中,我已经进行了详细注释,应该能大致看懂。下面重点解析几个容易出错的部分。
1. User-Agent问题
以下摘自:http://blog.csdn.net/qq_17612199/article/details/51106827
User-Agent是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。