1, 什么是网络爬虫?
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
2, 网络爬虫的运行原理。
a) 通用爬虫的原理;
定义起始url进行爬取,将网页中的url放入url队列中,同时将内容抓取,判断是否还有url,如果还有就继续爬,没有就结束了。
b) 聚焦爬虫的原理;
定义抓取内容,然后对抓取内筒进行一个过滤后爬取,之后与通用爬虫一样。
3, 正则表达式。
import re à 导入正则表达式包
data = re.search(“a”,”a”); à 存在匹配就返回一个匹配对象。
print data.group(0); à 打印得到结果
*正则表达式:
\n –>(匹配)回车 \w à任意字母数字或者下划线\dà数字 \s空格 \W 与\w相反
\S 非空格 a[jsz]n à 中间3个字母取任意一个。 ^开始位置 .任意字符 $ 结束位置
*表示一次两次或者多次?一次或者0次+ 一次或者多次t{n} t出现了n次 t{m,n}出现了m到n次 ()输出的就是其中的内容, |或者
其他的在基础中已将讲过了,就不再罗嗦。
4, urllib包与urllib2包
Python中包含了两个网络模块,分别是urllib与urllib2,urllib2是urllib的升级版,拥有更强大的功能。urllib,让我们可以像读文件一样,读取http与ftp。而urllib2,则在urllib的基础上,提供了更多的接口,如cookie、代理、认证等更强大的功能。值得一提的就是python3之后,urllib已经替代了urllib2,也就是python中只有urllib。
l 常用函数。
urlopen(网址,timeout)#就是打开路径这个网址,返回一个文件的句柄,这里要讲下,timeout参数设置超时时间,若时间超过就抛异常。
urlretrieve(“网址”,”本地路径”)#将该网址的网页文件爬到并报存到这个路径
urlcleanup()#清理缓存,在操作过程中都存在缓存。
info()#显示当前环境的一些信息。
getcode()#获得返回的码,比如200,404,303什么的。
geturl()#获取url
queto()#对中文进行一个编码,向url中
5, 简单爬虫。
Import re
import urllib.request
#from urllib import request
data = urllib.request.openurl(‘http://www.XXX.com’)#此处网址是随意写的。得到的是一个网页文件。需要注意的是http不能写成https,因为https是一个安全的版本,python无法爬取相关内容。
Datainf = data.read()
Datainf = datainf.decode(‘utf-8’)
Pat = ‘(*)’ #正在表达式
Re.compile(pat,datainf)#就可以匹配出相关的内容,返回的结果是一个数组
6, 模拟请求方式的爬虫。
a) get请求方式
get请求就是在url后面加入参数传入后台的数据。
data = “中文”
data =urllib.request.queto(data);
url =”http://www.baidu.com/s?wd=“+data
urllib.request.urlopen(url)
就爬下来了百度搜索中文的页面数据。
b) post请求方式。
importurllib.parse #用于封装post表单的数据
import urllib.request#导入urllib库中的request模块
url = http://www.baidu.com/
mydata =urllib.parse.urlencode( #设置post的表单
{“name”:”denglu”,#登录账号
“pass”:”11233” #密码
}#字典类型
).encode(“utf-8”)#采用utf-8编码方式
req = urllib.request.Request(url,mydata)#封装请求
data =urllib.request.urlopen(req).read()#获取网页信息
7, 异常处理。
主要的异常有URLError与HTTPError,其中HTTPError是子类。
URLError:a,服务器出错;b,禁止访问;c,没网;d,HTTPError
import urllib.error#导入error异常包
importurllib.request #导入request请求包
try:
urllib.request.rulopen(“http://blog.csdn.net”)
excepturllib.error.URLError as e: #捕捉异常
if hasattr(e,”code”) #拿出异常码
print(e,code)
ifhasattr(e,”reason”) #拿出异常原因
print(r.reason)
输出: 403
Forbidden
8, 浏览器伪装技术。
将请求伪装成浏览器发出的请求。
import urllib.request
url = “http://www.baidu.com”
headers = (“User-Agent”,” Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/62.0.3202.89 Safari/537.36”)#元组,设置浏览器的标识,这是去浏览器header里面复制的标识。
opener = urllib.request.build_opener() #创建一个opener,我理解为爬虫句柄
opener.addheaders=[headers] #将标识放入爬虫中设置为头
data = opener.open(url).read() #爬取