【41计划打卡-04】python爬虫基础
往期:
前言
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的header
request.add_header('User-Agent','Mozilla/5.0')
# 发送请求获取结果
response=urllib2.urlopen(request)
添加特殊情景处理器,例如账号密码输入等,有些网站只有在用户登录时才能浏览,而情景处理器就能模拟这形式。
import urllib2, cookielib
# 创建cookie容器# 创建一个opener
opener=urllib.build_opener(urllib2.HTTPCookieProcessor(cj))
# 给urllib2安装opener
urllib2.install_opener(opener)
# 使用带有cookie的urllib2访问网页
response=urllib2.urlopen(request)
运行实例:
# coding:utf-8
import 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文档中找到。
官网网址:
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</a>
能有三种方式搜索
节点名称: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')
# 访问节点信息# 得到节点信息:<a href='1.html'>python<a># 获取查找到的a节点的href属性
node.name
# 获取查找到的a节点的href属性
node['href']
# 获取查找到的a节点的链接文字
node.get_text()
下面是具体的案例:
# coding:utf-8
# # 测试BeautifulSoup的程序
# import bs4# print bs4
from bs4 import BeautifulSoup
import re html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """
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基本的知识先讲到这里,下次给大家讲一个详细完整的例子吧。
QQ:545281848