爬虫简介
简单爬虫架构
简单爬虫架构-运行流程
URL管理器
URL管理器:管理待抓取URL集合和已抓取URL集合 –防止重复抓取、防止循环抓取
网页下载器
网页下载器:将互联网上URL对应的网页下载到本地的工具 网页下载器会将URL对应的互联网网页以HTML的形式下载到本地,存储成一个本地文件或内存字符串
Python有哪几种网页下载器? urllib2–python官方基础模块,支持直接URL下载,支持登录网页的cookie出来、代理处理等 requests–第三方包更强大
网页下载器–urllib2
urllib2下载网页方法1:最简洁方法
import urllib2
#直接请求
response=urllib2.urlopen('http://www.baidu.com')
#获取状态码,如果是200表示获取成功
print response.getcode()
#读取内容
cont=response.read()
urllib2下载网页方法2:添加data、http header
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)
urllib2下载网页方法3:添加特殊情景的处理器 例如:需要cookie
import urllib2,cookielib
#创建cookie容器
cj=cookielib.CookieJar()
#创建1个opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#给urllib2安装opener
urllib2.install_opener(opener)
#使用带有cookie的urllib2访问网页
response=urllib2.urlopen("http://www.baidu.com/")
网页解析器
网页解析器-Beautiful Soup
Beautiful Soup
–Python第三方库用于从HTML或XML中提取数据
–官网:https://www.crummy.com/software/BeautifulS
oup/bs4/doc/index.zh.html
创建BeautifulSoup对象
from bs4 import BeautifulSoup
#根据HTML网页字符串创建BeautifulSoup对象
soup=BeautifulSoup(
html_doc, #HTML文档字符串
'html.parser' #HTML解析器
from_encoding='utf8' #HTML文档的编码
)
搜索节点(find_all,find)
方法: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>
#获取查找到的节点的标签名称
node.name
#获取查找到的a节点的href属性
node['href']
#获取查找到的a节点的链接文字
node.get_text()
BeautifulSoup实例测试
测试环境:eclipse+pydev+python2.7
配置中遇到的问题及解决办法:http://blog.csdn.net/xue_changkong
/article/details/46755639
#coding:utf8
import re
from bs4 import BeautifulSoup
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='utf8')
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.name,link_node['href'],link_node.get_text()
print '正则匹配'
link_node=soup.find('a',href=re.compile(r"ill"))
print link_node.name,link_node['href'],link_node.get_text()
print '获取p段落文字'
p_node=soup.find('p',class_="title")
print p_node.name,p_node.get_text()
测试结果:
获取所有的链接 a http://example.com/elsie Elsie a http://example.com/lacie Lacie a http://example.com/tillie Tillie 获取lacie的链接 a http://example.com/lacie Lacie 正则匹配 a http://example.com/tillie Tillie 获取p段落文字 p The Dormouse’s story