往期:
前言
Python 是当前进行科学计算、数据挖掘的重要开发语言,因为大数据的崛起使之也逐渐流行,Python在网络抓取中性能较好,同时爬取的数据也能直接利用Python本身的开源工具进行挖掘,同时,由于Python现成的包好工具都比较成熟,非常适合编写爬虫和运用数据,这就使Python成了目前比较流行的用于编写爬虫的语言。
学习链接:
Python开发简单爬虫:http://www.imooc.com/learn/563
开发环境
每个人的开发环境各异,下面上是我的开发环境,对于必须的工具,我会 加粗。
windows10 (操作系统) ,pycharm (IDE,当然,用eclipse和sublime均可) , python (这个必须的额,我下面实现的代码版本是 2.7), BeautifulSoup4 、 urllib2 等。
什么是爬虫
爬虫是自动从互联网上获取数据的程序 。
下面是一张对简单爬虫的结构进行描述的图,其主体是URL管理器,网页下载器和网页解析器。爬虫调度端指的是对爬虫发布指令的端口,人可以对其进行设置,爬什么内容,怎么爬,需要进行什么其他的操作等,通过爬虫,就能够得到所需的有价值的数据。
下面一张时序图图简单讲述了爬虫的运行流程。从上往下看,调度器访问URL管理器查看其中由于可访问的待爬取的URL,如果返回是即将1个待爬的URL传给调取器,调度器让下载器将URL对应的网页下载下来,返回给调度器,调度器将下载的网页发给解析器进行解析,解析之后返回到调度器,此时数据已经初步形成,可以开始进一步的使用。如此循环直到URL管理器为空或者数据量足够大。
URL管理器
URL管理器 :管理待抓取的URL集合和已抓取URL集合。主要实现下面种功能。
- 添加新URL到待爬集合中。
- 判断待添加URL是否在容器中。
- 获取待爬取URL。
- 判断是否还有待爬取URL。
- 将待爬取URL移动到已爬取。
实现方式:
- 内存:python的set集合
- 关系数据库,MySQL,urls(url, is_crawled)
- 缓存数据库:redis的set集合
网页下载器
网页下载器:将互联网上URL对应网页下载到本地的工具。
python的网页下载器
- urllib2-python-官方基础模块
- requests-第三方更强大
urllab2下载器使用方法:
- 最简捷方法:直接写出链接并且请求。
import urllib2
直接请求response=urllib2.urlopen('http://www.baidu.com')
获取状态吗,如果是200表示成功print response.getcode()
#读取内容
cont=response.read()
- 添加data、http helper,data和httphelper能分别为下载提供更加精确的目标,同时可以模仿浏览器对网页进行访问,能攻破一些反爬虫策略。
import urllib2
创建Request对象request urllib2.Request(url)
添加数据request.add_data('a','1')
添加http的headerrequest.add_header('User-Agent','Mozilla/5.0')
发送请求获取结果response=urllib2.urlopen(request)
- 添加特殊情景处理器,例如账号密码输入等,有些网站只有在用户登录时才能浏览,而情景处理器就能模拟这形式。
import urllib2, cookielib
创建cookie容器# 创建一个openeropener=urllib.build_opener(urllib2.HTTPCookieProcessor(cj))
给urllib2安装openerurllib2.install_opener(opener)
使用带有cookie的urllib2访问网页response=urllib2.urlopen(request)
运行实例:
coding:utf-8import urllib2,cookielib
url="http://www.baidu.com"
print '方法1'
response1=urllib2.urlopen(url)
print response1.getcode()
print len(response1.read())print '方法2'
request=urllib2.Request(url) request.add_header("user-agent","Mozilla/5.0") response2=urllib2.urlopen(request)
print response2.getcode()
print len(response2.read())print '方法3'
cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) response3=urllib2.urlopen(request)
print response3.getcode()
print cjprint response3.read()
网页解析器
网页解析器:从网页中提取有价值数据的工具,侧面而言,也能看做是整合数据的一个步骤,但是由于爬取数据复杂度较高,所以不会将太多的数据整合、集成、清洗任务放在这里,只是进行简单的整合,成为数组或者矩阵等而已。
Beautiful Soup
- python第三方库,用于从HTML或者XML中提取数据,有自己的官网,同时还有API文档。
- 其下载方式可在API文档中找到。
官网网址:
https://www.crummy.com/software/BeautifulSoup/
API文档:
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
用法介绍如下图所示。BeautifulSoup对象创建之后能够去搜索节点,根据节点名、属性值或者是节点文字等信息进行查询,能够达到精确搜索的目的,减少垃圾数据获取。
举一个例子,对一个标签:
能有三种方式搜索
- 节点名称:a
- 节点属性:"href='123.html',和class=article_link"
- 节点内容:python
语法使用如下:
from bs4 import BeautifulSoup
根据HTML网页字符串创建BeautifulSoup对象soup=BeautifulSoup(
html_doc, # HTML文档字符串
'html.parser' # HTML解析器
from_encoding='utf-8' # HTML文档编码
)搜索节点方法:find_all(name,attrs,string)查找所有标签为a的节点soup.find_all('a')
查找所有标签为a,链接符合/view/123.htm形式的节点soup.find_all('a',href='/view/123.htm') soup.find_all('a',href=re.compile(r'/view/\d+.htm'))
查找所有标签为div,class为abc,文字为python节点soup.find_all('div',class_='abc',string='python')
访问节点信息# 得到节点信息:python# 获取查找到的a节点的href属性node.name
获取查找到的a节点的href属性node['href']
获取查找到的a节点的链接文字node.get_text()
下面是具体的案例:
coding:utf-8# 测试BeautifulSoup的程序import bs4# print bs4from bs4 import BeautifulSoup
import rehtml_doc = """
The Dormouse's storyThe Dormouse's story
Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.
...
"""soup=BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')
print '获取所有的链接'
links=soup.find_all('a')
for link in links:
print link.name,link['href'],link.get_text()print '获取Lacie的链接'
link_node=soup.find('a',href='http://example.com/lacie')
print link_node,link_node['href'],link_node.get_text()print '正则匹配'
link_node=soup.find('a',href=re.compile(r"ill"))
print link_node,link_node['href'],link_node.get_text()print '获取P段落文字'
p_node=soup.find('p',class_="title")
print p_node.name,p_node.get_text()
Python基本的知识先讲到这里,下次给大家讲一个详细完整的例子吧。
微信:zgr950123
QQ:545281848
欢迎关注