2024年5月6日发(作者:)
华院数据 高怡宁
大 纲
1、 新浪微博爬虫概览
1) 主要内容和结果说明
2) 主要步骤和本地保存文件截图
2、 基本工具的使用:urllib2、beautifulsoup、regex和HttpFox、Firebug等
1) urllib2:
a) urllib2的基本用途、主要函数:urlopen、request、urlencode
b) 如何post数据、cookie的设置、headers的设置
c) 浏览器插件简介
2)beautifulsoup:
a) Bs的安装、基本用途
b) Bs的基本语句和常见问题
c) 其他格式的数据怎么处理: json、JavaScript
3)regex:
a) 正则表达式的基本用途
b) Re模块的基本语句
4) 异常和处理方式
a) try….except
b) HTTP 异常码
5) 文件读写创建等常用操作
6) 关于编码问题
7) 运用以上工具实现一个基本的网页抓取
例子:抓取失信名单
3、 关于抓微博数据的经验
1) 模拟登陆
2) 程序设计
3) 常见问题
1
华院数据 高怡宁
一、新浪微博爬虫概览
从一个起始用户开始,爬取(1)主页、头像信息;(2)前五页的粉丝关注列表;(3)
所有微博内容、发表时间 (4)提取每条微博中at、转发、评论、点赞的用户。根据这个起
始用户爬到的所有关系用户,遍历这些关系用户的相同内容。
一共提取了三级网络,共5万多名用户的信息。
一些步骤和结果展示:
图一:用户主页和使用浏览器插件定位源代码
图二: 本地保存的点文件和边文件
2
华院数据 高怡宁
图三:用户10503的相关用户信息列表
图四:用户基本信息及其相关用户中受教育比例,就业比例信息
3
华院数据 高怡宁
图五:微博列表和每页微博的保存
二、基本工具的使用
(1)urllib2
urllib2是python的一个获取url(Uniform Resource Locators,统一资源定址器)的模块。
它用urlopen函数的形式提供了一个非常简洁的接口。这使得用各种各样的协议获取url成
为可能。
注意,urllib 和urllib2(python3已经合并成一个了)都是接受URL请求的相关模块,但是
提供了不同的功能。因此urllib也常和urllib2一起使用。
urlopen
下面是一个最简单的urllib2的应用:
上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。我们可以用浏
览器打开百度主页,右击,选择查看源代码,会发现也是完全一样的内容:
4
华院数据 高怡宁
除了"http:",URL同样可以使用"ftp:","file:"等等来替代。
HTTP是基于请求和应答机制的:客户端提出请求,服务端提供应答。urllib2用一个
Request对象来映射你提出的HTTP请求。通过调用urlopen并传入Request对象,将返回
一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response
中调用.read()。下面的几行命令和上面命令的效果是一样的:
在下面我们会看到,当需要POST数据,或者说设置Header信息时,连接代理服务器,
就需要使用Request()方法了。
发送表单数据
有时你想向一个URL发送数据(post)。当你发送一个你在网上填的form(表单)时,
这通常是你的浏览器所做的。并不是所有的Post请求都来自HTML表单,这些数据需要被
以标准的方式encode,然后作为一个数据参数传送给Request对象。Encoding是在urllib中
完成的,而不是在urllib2中完成的。所以这时需要同时导入urllib。
这种方法常常运用在网站访问需要登陆的情况。我们来看一个例子:
1) 用python模拟登陆山东大学的成绩查询网站:
首先,我们需要知道登陆网站时post了什么数据。我们通过浏览器插件监视post的数
据:先来到登录页面,把httpfox打开,clear之后,点击start开启检测。然后,输入个人信
息,确保httpfox处于开启状态,然后点击确定提交信息,实现登录。
5
华院数据 高怡宁
这个时候可以看到,httpfox检测到了三条信息:其中一条是post,两条get。点击stop
键,确保捕获到的是访问该页面之后反馈的数据,以便我们做爬虫的时候模拟登陆使用。
直接查看PostData的内容,可以看到一共POST两个数据,stuid和pwd,即为用户名和
密码。点击cookie标签,看看cookie信息:
可以看到,收到了一个ACCOUNT的cookie,并且在session结束之后自动销毁。
那么提交之后收到了哪些信息呢?这需要查看后面的两个GET数据。
6
华院数据 高怡宁
第一个get的内容是text/html,应该是返回的html文本。点击content标签可以查看收
到的内容。据此我们了解到,html页面的内容是发送了cookie信息之后才接受到的。第二
个get没有什么大作用。
分析得到登陆流程:
——首先,我们POST学号和密码--->然后返回cookie的值
——然后发送cookie给服务器--->返回页面信息。
这时,还有一个问题没有解决:那就是POST的数据到底发送到了哪里?注意,我们在
地址栏看到的地址往往不是提交表单的地址。那么怎样才能获得真正的地址?右击查看页面
源代码通常可以定位到提交表单对话框的链接:
网站的原来的地址是:
:7777/zhxt_bks/zhxt_
所以,真正的表单提交的地址应该是:
:7777/zhxt_bks/xk_
我们的POST数据提交到的页面,应该是表单form的ACTION中提交到的页面。查看该
网址源码,我们就知道POST数据到底发送到了哪里:
7
华院数据 高怡宁
整理到地址栏中,完整的地址应该如下:
:7777/pls/wwwbks/bks_
一般而言,post的data需要转码才能在urllib中使用。用ode语句,这点在
下文中会再说到。
设置cookie:cookielib
在上面的内容中我们提到有时候需要浏览器记录服务器返回的cookie值以便下次访问
服务器时带上cookie。urllib2 对 Cookie 的处理也是自动的,只要载入cookielib包,写入如
下语句就好:
上面语句第一句创建了一个cookie对象cj,CookieJar 存储HTTP请求生成的cookie,并
向传出HTTP请求中添加cookie,整个cookie都存在内存中。第二句创建了一个opener。第
三句可不写。
设置headers(头文件)
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览
器。浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个
包含头数据的字典,伪装成一个浏览器:
在发送request时带上头文件即可:
8
华院数据 高怡宁
可以看到,post的数据也是在request时写入的。
浏览器插件
下面介绍两款浏览器插件:
1)HttpFox插件
这是一款http协议分析插件,分析页面请求和响应的时间、内容、以及浏览器用到的
COOKIE等。
安装在火狐上即可,效果如图:
点击start是开始检测,点击stop暂停检测,点击clear清除内容。一般在使用之前,点
击stop暂停,然后点击clear清屏,确保看到的是访问当前页面获得的数据。
这个插件可以直观的看到页面发送的请求和收到的响应。
2)Firebug
Firebug是网页浏览器 Mozilla Firefox下的一款开发类插件, 现属于Firefox的五星级强
力推荐插件之一。它集HTML查看和编辑、Javascript控制台、网络状况监视器于一体。之前
httpfox中提到的功能它都有。
在爬虫中常常用到一个功能是点击查看页面中的元素:比如我将鼠标定位在想要查看的
网页位置,监控框内出现这个位置对应的源码位置:在下图中,我将鼠标定位在”百度“:
9
华院数据 高怡宁
这个功能在下一节使用beautifulsoup解析网页时非常有帮助。
一个包含简单网站登陆的例子
我们继续看完上文中提到的python登陆山东大学成绩查询网站的例子,下面是完整地
代码:
(2)Beautifulsoup
什么是beautifulsoup?
Beautiful Soup 是一个基于DOM结构从HTML或XML文件中提取数据的Python库。使
用这个工具(可能也需要正则表达式),基本上可以提取到任何你想要的网页上的数据。
我们以下面一段简单的html代码来说明beautifulsoup的作用:
10
华院数据 高怡宁
使用BeautifulSoup解析这段代码,能够得到一个 BeautifulSoup 的对象,并能方便地浏
览结构化数据:
beautifulsoup的常用语句
归纳一下使用beautifulsoup提取html页面结构化信息的几种常用方法:
(1)标签(tag)
可以通过标签的名字直接定位:如上面的soup.p定位到第一个p标签内的全部内容。
也可以通过标签属性定位:如上面的soup.p[‘class’],可以定位到属性的值。
定位到某个tag后,可以用string 方法和 get_text() 获取文本内容。
11
华院数据 高怡宁
(2)findAll搜索
findAll(), 就是find_all(),是一种过滤器,返回的是一个列表。例如:在上面的例子中,
_all(‘a’) 返回的是所有的a标签,可以通过指定列表的下标指定定位的是那个标签。
findAll方法的attrs 参数定义一个字典参数来搜索包含特殊属性的tag:中同时可以加入
标签的属性值进行过滤:
理解下面语句的含义:
当findAll方法返回的列表中只有一个值时,findAll()[0]和find() 的效果是一样的。
(3)常见问题
1)如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内
容, .string 的输出结果是 None。返回值为None时,继续对None值操作可能会报错。如
上面的例子:
这也是string和get_text()方法的不同,上面如果替换成get_text()是可以运行的。
2)注意,findAll()方法返回的是列表,哪怕列表中只有一个值,继续操作时也要写上[0],
取出这个值,否则可能报错。如在上面的语句中,定位到’table’的[0]一定要写。
此外,findAl()方法如果没有找到结果,返回值为空,继续操作将会报错。
3) 注意编码:查看网页的源码,如from_encoding=’utf-8’
(4)查阅Beautifulsoup 官方文档:
/software/BeautifulSoup/bs4/doc/#id25
安装beautifulsoup
easy_install beautifulsoup4即可。
注意导入的时候是from bs4 import beautifulsoup。
JavaScript怎么处理?
12
华院数据 高怡宁
这时直接使用bs提取不到
评论列表(0条)