- 明确目标 (要知道你准备在哪一个范围或者网站去搜索)
- 爬 (将全部的网站的内容所有爬下来)
- 取 (去掉对咱们没用处的数据)
- 处理数据(按照咱们想要的方式存储和使用) 网络爬虫要作的,简单来讲,就是实现浏览器的功能。经过指定url,直接返回给用户所须要的数据,而不须要一步步人工去操纵浏览器获取。
推荐一篇文章:关于反爬虫,看这一篇就够了html
#1.通用爬虫 VS 聚焦爬虫 ###1.通用爬虫:搜索引擎使用的爬虫系统python
###2. 聚焦爬虫: 为了解决通用爬虫的缺陷,开发人员针对特定用户而开发的数据采集程序 特色:面向需求,需求驱动开发编程
#2.HTTP & HTTPSjson
HTTP:超文本传输协议:Hyper Text Transfer Protocalsegmentfault
HTTPS: Secure Hypertext Transfer Protocol 安全的超文本传输协议浏览器
HTTP请求:网络上的网页访问,通常使用的都是超文本传输协议,用于传输各类数据进行数据访问,从浏览器发起的每次URL地址的访问都称为请求,获取数据的过程称为响应数据缓存
抓包工具:在访问过程当中,获取网络上传输的数据包的工具称为抓包工具,抓包:网络编程中专业术语名词,指代的是对网络上传输的数据进行抓取解析的过程。我以前用的是Wireshark,其余专业抓包工具如Sniffer,wireshark,WinNetCap.WinSock ,如今用的是Fiddler 抓包,Fiddler 下载地址。安全
浏览器设置代理进行数据抓包——建议使用谷歌的插件快捷设置不一样的代理——Falcon Proxybash
#3.urllib2服务器
编码函数:
urlencode()
远程数据取回:urlretrieve()
urlopen()
Request()
urllib2第一弹——urlopen()
-urlopen()->response
->response->read()抓取网页数据
->response->info() 抓取网页请求报头信息
->response->geturl()抓取访问地址
->response->getcode()抓取访问错误码
复制代码
注解:
urllib2库里面的urlopen方法,传入一个URL,协议是HTTP协议,urlopen通常接受三个参数,urlopen(url, data, timeout)
response对象有一个read方法,能够返回获取到的网页内容,即response.read()
urlopen参数能够传入一个request请求,它其实就是一个Request类的实例,构造时须要传入Url,Data等等的内容
代码操做一
# -*- coding:utf-8 -*-
#引入
import urllib2
response=urllib2.urlopen('https://www.baidu.com')
content=response.read()
print(content)
复制代码
####1.headers的属性介绍
User-Agent : 有些服务器或 Proxy 会经过该值来判断是不是浏览器发出的请求 Content-Type : 在使用 REST 接口时,服务器会检查该值,用来肯定 HTTP Body 中的内容该怎样解析。 application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用 application/json : 在 JSON RPC 调用时使用 application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用 在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会致使服务器拒绝服务
注意:Sublime使用正则匹配替换^(.*):(.*)$
--> "\1":"\2",
在pycharm中则是^(.*):(.*)$
--> "$1":"$2",
能够经过调用
Request.add_header()
添加/修改一个特定的header 也能够经过调用Request.get_header()
来查看已有的header。
# urllib2_add_headers.py
import urllib2
import random
url = "http://www.itcast.cn"
ua_list = [
"Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
"Mozilla/5.0 (Macintosh; Intel Mac OS... "
]
user_agent = random.choice(ua_list)
request = urllib2.Request(url)
#也能够经过调用Request.add_header() 添加/修改一个特定的header
request.add_header("User-Agent", user_agent)
# 第一个字母大写,后面的所有小写
request.get_header("User-agent")
response = urllib2.urlopen(req)
html = response.read()
print html
复制代码
代码操做二,假装浏览器访问
# -*- coding:utf-8 -*-
#引入
import urllib2
from urllib2 import Request
#假装浏览器访问
my_header={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36 2345Explorer/8.7.0.16013'}
request=Request('https://www.baidu.com',headers=my_header)
response=urllib2.urlopen(request)
content=response.read()
print(content)
复制代码
####2.Referer (页面跳转处) Referer:代表产生请求的网页来自于哪一个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性能够用来跟踪Web请求来自哪一个页面,是从什么网站来的等。
有时候遇到下载某网站图片,须要对应的referer,不然没法下载图片,那是由于人家作了防盗链,原理就是根据referer去判断是不是本网站的地址,若是不是,则拒绝,若是是,就能够下载;
####3.Accept-Encoding(文件编解码格式)
**Accept-Encoding:**指出浏览器能够接受的编码方式。编码方式不一样于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应以后先解码,而后再检查文件格式,许多情形下这能够减小大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, ;q=0
若是有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回通过gzip编码的HTML页面。 若是请求消息中没有设置这个域服务器假定客户端对各类内容编码均可以接受。
####4.Accept-Language(语言种类) Accept-Langeuage:指出浏览器能够接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器可以提供一种以上的语言版本时要用到。
####5. Accept-Charset(字符编码)
Accept-Charset:指出浏览器能够接受的字符编码。
举例:Accept-Charset:iso-8859-1,gb2312,utf-8
####6. Cookie (Cookie)
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它能够记载和服务器相关的用户信息,也能够用来实现会话功能,之后会详细讲。
####7. Content-Type (POST数据类型)
Content-Type:POST请求里用来表示的内容类型。
举例:Content-Type = Text/XML; charset=gb2312:
指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。
####7.服务端HTTP响应
HTTP响应也由四个部分组成,分别是: 状态行、消息报头、空行、响应正文
#4.经常使用的响应报头(了解) 理论上全部的响应头信息都应该是回应请求头的。可是服务端为了效率,安全,还有其余方面的考虑,会添加相对应的响应头信息,从上图能够看到:
##1. Cache-Control:must-revalidate, no-cache, private。
这个值告诉客户端,服务端不但愿客户端缓存资源,在下次请求资源时,必需要重新请求服务器,不能从缓存副本中获取资源。
Cache-Control是响应头中很重要的信息,当客户端请求头中包含Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control做为做为回应信息,一般会返回no-cache,意思就是说,"那就不缓存呗"。
当客户端在请求头中没有包含Cache-Control时,服务端每每会定,不一样的资源不一样的缓存策略,好比说oschina在缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在86400秒的时间内,客户端能够直接从缓存副本中读取资源,而不须要向服务器请求。
##2. Connection:keep-alive
这个字段做为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp链接也是一个长链接,客户端能够继续使用这个tcp链接发送http请求。
##3. Content-Encoding:gzip
告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。
##4. Content-Type:text/html;charset=UTF-8
告诉客户端,资源文件的类型,还有字符编码,客户端经过utf-8对资源进行解码,而后对资源进行html解析。一般咱们会看到有些网站是乱码的,每每就是服务器端没有返回正确的编码。
##5. Date:Sun, 21 Sep 2016 06:18:21 GMT
这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不一样时区在相互请求资源的时候,时间混乱问题。
##6. Expires:Sun, 1 Jan 2000 01:00:00 GMT
这个响应头也是跟缓存有关的,告诉客户端在这个时间前,能够直接访问缓存副本,很显然这个值会存在问题,由于客户端和服务器的时间不必定会都是相同的,若是时间不一样就会致使问题。因此这个响应头是没有Cache-Control:max-age=*这个响应头准确的,由于max-age=date中的date是个相对时间,不只更好理解,也更准确。
##7. Pragma:no-cache
这个含义与Cache-Control等同。
##8.Server:Tengine/1.4.6
这个是服务器和相对应的版本,只是告诉客户端服务器的信息。
##9. Transfer-Encoding:chunked
这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。通常分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,因此采用分块发送,每一块都是独立的,独立的块都能标示本身的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就能够肯定资源已经传输完了。
##10. Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,如今这个字段用处并不大,由于如今的浏览器都是支持压缩的。
响应状态码
响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
常见状态码:
100~199
:表示服务器成功接收部分请求,要求客户端继续提交其他请求才能完成整个处理过程。
200~299
:表示服务器成功接收请求并已完成整个处理过程。经常使用200(OK 请求成功)。
300~399
:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、经常使用302(所请求的页面已经临时转移至新的url)、307和304(使用缓存资源)。
400~499
:客户端的请求有错误,经常使用404(服务器没法找到被请求的页面)、403(服务器拒绝访问,权限不够)。
500~599
:服务器端出现错误,经常使用500(请求未完成。服务器遇到不可预知的状况)。 ##Cookie 和 Session:
服务器和客户端的交互仅限于请求/响应过程,结束以后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的连接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:经过在 客户端 记录的信息肯定用户的身份。
Session:经过在 服务器端 记录的信息肯定用户的身份。