Python爬虫实战:爬取官员官方信息

本文介绍了使用Python爬虫爬取中国官员官方信息的全过程,包括文本爬取、图片爬取、分词、信息抽取和关系网构建。文中详细讲解了分析网址规律、提取数据的难点,以及正则表达式、BeautifulSoup库的使用,并分享了在处理User-Agent、编码解码问题时的经验。此外,还涉及了图片爬取和分词技术,使用了pyltp进行命名实体识别。
摘要由CSDN通过智能技术生成

最近导师给了一个任务:用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 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值