课程链接Python开发简单爬虫
0.必要说明
我的java版本1.8,python版本3.6,eclipse版本4.5,BeautfilSoup版本4。
视频中用到的python版本2.7。
有几个坑需要注意:
- python3.6不支持urllib2。而是换位:urllib。
- 百度百科页面模式变了,所以我们爬的话需要改变策略。
1.爬虫简介
爬虫:一段自动抓取互联网信息的程序 互联网由各种各样的网页组成,每个网页都有对应的url。一个Url上又能指向其他url。这种url之间相互的指向关系,就形成了一个网状。爬虫是设置了主体,设置了目标自动从互联网上获取我们需要的数据。它可以从一个url出发,到达所有与他相关的url。并且从每个页面提取出我们需要的数据也就是说,他是自动访问互联网并且提取数据的程序。
爬虫价值?互联网信息,为我所用!
eg.新闻聚合阅读器,最爆笑故事app,图书价格对比,技术大全。
2.简单爬虫架构
爬虫调度端(启动爬虫,停止爬虫,监事爬虫运行情况
爬虫:
- URL管理器:对将要爬取的url和已经爬取过的url进行管理。从中可以我们可以取出一个带爬取的url,传送给网页下载器。
- 网页下载器:会将指定的网页下载下载存储成一个字符串。这个字符串回传送给网页解析器。
- 网页解析器:会解析出有价值的数据;该页面被解析出的url将被补充进URL管理器。
运行流程:
3.URL管理器
管理待抓取URL集合和已抓取URL集合——防止重复抓取、循环抓取
伪代码如下:
if(URL尚未存在容器中){
添加新URL到带爬取的集合中。
}
if(容器中还有待爬取URL) {
获取带爬取URL;
//todo;(将给其他组件处理)
将URL从带爬取集合移动到已爬取集合。
}
实现URL管理器
- 待爬取URL和已爬取URL放到内存中:Python-set() —set()
- 关系型数据库中Mysql-urls(url , is_crwaled)
- 缓存型数据库Redis -set -set
4.网页下载器urllib2
将互联网URL对应的网页下载到本地。
网页下载器通过URL对应的网页以HTML方式下载到本地。存储成本地文件/内存字符串。
urllib2——pythone官方基础模块。支持直接URL下载,或者向网页提供以下需要用户输入的数据。甚至支持需要登录网页的cookie处理。需要代理访问的增强处理。
requests——三方提供,更为强大。
urlllib2下载网页三种方法:
1.urllib2.urlopen(url)
import urllib2
//直接请求
response = urllib2.urlopen("http://www.baidu.com")
//获取状态码,如果是200表示获取成功
print response.getcode()
//读取内容
cont = response.read()
2.增强处理data,http header
url,data,header给urllib2.Requset类,生成一个Requset对象。然后urllib2.urlopen(request)
import urllib2
//创建Requset对象
requset = urllib2.Requset(url)
//添加数据
requset.add_data('a' , '1')
//添加http的header。伪装成Mozilla浏览器
requset.add_header('User-Agent','Mozilla/5.0')
//发送请求处理结果
response = urllib2.urlopen(requset)
3.添加特殊情景处理器
HTTPCookieProcessor
ProxyHandler
HTTPShandler
HTTPRedirectHandler
传递给opener = urllib2.bulid_opener(handler)
urllib2.install_opener(opener)
urllib2.urlopen(url)或者
urllib2.urlopen(requset)
import urllib2,cookilelib
//创建cookile容器,存储cookie数据
cj = cookilelib.CookileJar()
//创建一个opernr
opener = urllib2.bulid_opener(urllib2.HTTPCookieProcssor(cj))
//给urllib2安装opener
urllib2.install_opener(opener)
//使用带有的cookie的urllib2访问网页
response = urllib2.urlopen("http://www.baidu.com")
5.网页解析器BeautifulSoup
从网页中提取有价值的工具
HTML网页字符串交给网页解析器,他会提取出价值数据和新URL列表
Python有哪几种网页解析器?
- 模糊匹配
- 正则表达式
- 结构化解析:将整个网页解析成DOM树进行上下级遍历与访问
- html.parser
- (糅合html.parser和lxml)
- lxmlBeautifulSoup
关于BeautifulSoup官方文档
语法(套路):
html->创建BeautifulSoup对象->搜索节点(可以按照名称属性文字进行搜索)->访问节点名称属性文字
<a href="123.html" class='article_tink'>Python</a>
from bs4 import BeautifulSoup
#根据html网页字符串创建Beautiful3Soup对象
soup = Beautiful(
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.compole(r'/view/\d+\.html'))
#查找所有标签为div , class为abc,文字为Python的节点
soup.find_all('div' , class_='abc' , string='Python')
#访问节点信息
#得到节点<a href="1html">Python</a>
#获取查找到的节点的标签名称
node.name()
#获取查找到的a节点的href属性
node['href']
#获取查找到的a节点的链接文字
node.get_text()
6.完整实例:
- 确定目标(爬取百度百科Python词条相关1000个页面数据)
- 入口页:https://baike.baidu.com/item/Python/407313?fr=aladdin
- url格式
- 数据格式
- 页面编码
- 分析目标(策略!URL格式【审查元素】,数据格式,网页编码)
- 编写代码
- 执行爬虫
7.目录结构:
8.代码:
注意:需要自己调整策略。因为百度的页面会升级。