爬虫
网络是一爬虫种自动获取网页内容的程序,是搜索引擎的重要组成部分。网络爬虫为搜索引擎从万维网下载网页。通常分为传统爬虫和聚焦爬虫。javascript
爬虫的分类
传统爬虫从一个或若干初始网页的URL开始,得到初始网页上的URL,在抓取网页的过程当中,不断从当前页面上抽取新的URL放入队列,直到知足系统的必定中止条件。通俗的讲,也就是经过源码解析来得到想要的内容。html
聚焦爬虫的工做流程较为复杂,须要根据必定的网页分析算法过滤与主题无关的连接,保留有用的连接并将其放入等待抓取的URL队列。而后,它将根据必定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时中止。另外,全部被爬虫抓取的网页将会被系统存贮,进行必定的分析、过滤,并创建索引,以便以后的查询和检索;对于聚焦爬虫来讲,这一过程所获得的分析结果还可能对之后的抓取过程给出反馈和指导。java
防爬虫:KS-WAF将爬虫行为分为搜索引擎爬虫及扫描程序爬虫,可屏蔽特定的搜索引擎爬虫节省带宽和性能,也可屏蔽扫描程序爬虫,避免网站被恶意抓取页面。python
爬虫的本质
网络爬虫本质就是浏览器http请求。web
浏览器和网络爬虫是两种不一样的网络客户端,都以相同的方式来获取网页:正则表达式
1)首先, 客户端程序链接到域名系统(DNS)服务器上,DNS服务器将主机 名转换成ip 地址。算法
2)接下来,客户端试着链接具备该IP地址的服务器。服务器上可能有多个 不一样进程程序在运行,每一个进程程序都在监听网络以发现新的选接。.各个进程监听不一样的网络端口 (port). 端口是一个l6位的数卞,用来辨识不一样的服务。Http请求通常默认都是80端口。数据库
3) 一旦创建链接,客户端向服务器发送一个http请求,服务器接收到请求后,返回响应结果给客户端。json
4)客户端关闭该链接。浏览器
通用的爬虫框架流程:
1)首先从互联网页面中精心选择一部分网页,以这 些网页的连接地址做为种子URL;
2)将这些种子URL放入待抓取URL队列中;
3)爬虫从待抓取 URL队列依次读取,并将URL经过DNS解析,把连接地址转换为网站服务器对应的IP地址。
4)而后将IP地址和网页相对路径名称交给网页下载器,
5)网页下载器负责页面内容的下载。
6)对于下载到 本地的网页,一方面将其存储到页面库中,等待创建索引等后续处理;另外一方面将下载网页的 URL放入己抓取URL队列中,这个队列记载了爬虫系统己经下载过的网页URL,以免网页 的重复抓取。
7)对于刚下载的网页,从中抽取出所包含的全部连接信息,并在已抓取URL队列 中检査,若是发现连接尚未被抓取过,则将这个URL放入待抓取URL队歹!
8,9)末尾,在以后的 抓取调度中会下载这个URL对应的网页,如此这般,造成循环,直到待抓取URL队列为空
爬虫的基本流程:
发起请求:
经过HTTP库向目标站点发起请求,也就是发送一个Request,请求能够包含额外的header等信息,等待服务器响应
获取响应内容
若是服务器能正常响应,会获得一个Response,Response的内容即是所要获取的页面内容,类型多是HTML,Json字符串,二进制数据(图片或者视频)等类型
解析内容
获得的内容多是HTML,能够用正则表达式,页面解析库进行解析,多是Json,能够直接转换为Json对象解析,多是二进制数据,能够作保存或者进一步的处理
保存数据
保存形式多样,能够存为文本,也能够保存到数据库,或者保存特定格式的文件
详情请看http://www.cnblogs.com/alex3714/articles/8359348.html
什么是Urllib库
Urllib是Python提供的一个用于操做URL的模块,咱们爬取网页的时候,常常须要用到这个库。
升级合并后,模块中的包的位置变化的地方较多。在此,列举一些常见的位置变更,方便以前用Python2.x的朋友在使用Python3.x的时候能够快速掌握。
常见的变化有:
- 在Pytho2.x中使用import urllib2——-对应的,在Python3.x中会使用import urllib.request,urllib.error。
- 在Pytho2.x中使用import urllib——-对应的,在Python3.x中会使用import urllib.request,urllib.error,urllib.parse。
- 在Pytho2.x中使用import urlparse——-对应的,在Python3.x中会使用import urllib.parse。
- 在Pytho2.x中使用import urlopen——-对应的,在Python3.x中会使用import urllib.request.urlopen。
- 在Pytho2.x中使用import urlencode——-对应的,在Python3.x中会使用import urllib.parse.urlencode。
- 在Pytho2.x中使用import urllib.quote——-对应的,在Python3.x中会使用import urllib.request.quote。
- 在Pytho2.x中使用cookielib.CookieJar——-对应的,在Python3.x中会使用http.CookieJar。
- 在Pytho2.x中使用urllib2.Request——-对应的,在Python3.x中会使用urllib.request.Reques
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparser robots.txt解析模块
先进行一个简单的实例:利用有道翻译(post请求)
1 #引入模块 2 import urllib.request 3 import urllib.parse 4 5 6 #URL选好很是重要,选很差将会出错 7 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' 8 9 10 ''' 11 设置Headers 12 有不少网站为了防止程序爬虫爬网站形成网站瘫痪,会须要携带一些headers头部信息才能访问,最长见的有user-agent参数 13 ''' 14 headers = { 15 'Accept': 'application/json, text/javascript, */*; q=0.01', 16 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 17 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 18 'X-Requested-With':'XMLHttpRequest' 19 } 20 21 key = input('enter your word:\n') 22 23 form_data = { 24 'i': key, 25 'from':'AUTO', 26 'to':'AUTO', 27 'keyfrom':'fanyi.web', 28 'doctype':'json', 29 'version':'2.1', 30 'action':'FY_BY_REALTIME', 31 'typoResult':'flase' 32 } 33 34 35 36 ''' 37 这里用到urllib.parse,经过urllib.parse.urlencode(form_data).encode(encoding='utf-8')能够将post数据进行转换放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。 38 因此若是咱们添加data参数的时候就是以post请求方式请求,若是没有data参数就是get请求方式 39 ''' 40 data =urllib.parse.urlencode(form_data).encode(encoding='utf-8') 41 42 request = urllib.request.Request(url, data=data , headers=headers) 43 44 45 ''' 46 urlopen通常经常使用的有三个参数,它的参数以下:urllib.requeset.urlopen(url,data,timeout) 47 48 固然上述的urlopen只能用于一些简单的请求,由于它没法添加一些header信息,不少状况下咱们是须要添加头部信息去访问目标站的,这个时候就用到了urllib.request 49 50 51 52 ''' 53 response = urllib.request.urlopen(request) 54 55 #response.read()能够获取到网页的内容 56 result = response.read().decode('utf8') 57 #target = json.loads(result) 58 #target = urllib.parse.unquote(target) 59 #print(target['translateResult'][0][0]["tgt"]) 60 #a = target['translateResult'][0][0]["tgt"] 61 #print(type(a)) 62 #print(a) 63 print(result) 64 #print(target)
运行结果:
enter your words: I love python {"type":"EN2ZH_CN", "errorCode":0, "elapsedTime":1, "translateResult":[[{"src":"I love python", "tgt":"我喜欢python"}]] }
另一个简单的小实例是:豆瓣网剧情片排名前20的电影(Ajax请求)
1 import urllib.request 2 import urllib.parse 3 import json 4 5 url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action' 6 7 headers = { 8 'Accept': ' */*', 9 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 10 'X-Requested-With':'XMLHttpRequest' 11 } 12 13 form_data = { 14 'start': '0', 15 'limit': '20' 16 } 17 18 data =urllib.parse.urlencode(form_data).encode(encoding='utf-8') 19 request = urllib.request.Request(url, data=data , headers=headers) 20 response = urllib.request.urlopen(request) 21 result = response.read() 22 targets = json.loads(result) 23 24 #print(result) 25 for num,target in enumerate(targets): 26 print(num+1, target["title"])
运行结果:
1 肖申克的救赎 2 控方证人 3 霸王别姬 4 美丽人生 5 这个杀手不太冷 6 阿甘正传 7 辛德勒的名单 8 十二怒汉 9 泰坦尼克号 3D版 10 十二怒汉 11 控方证人 12 盗梦空间 13 灿烂人生 14 茶馆 15 背靠背,脸对脸 16 巴黎圣母院 17 三傻大闹宝莱坞 18 千与千寻 19 泰坦尼克号 20 海上钢琴师
这些只是一些简单的运用。