威尼斯人线上娱乐

爬虫类别,python爬虫入门

27 3月 , 2019  

爬虫简介

 什么是爬虫?

爬虫类别,python爬虫入门。爬虫:正是抓取网页数据的顺序。

HTTP和HTTPS

HTTP协议(HyperText Transfer
Protocol,超文本传输协议):是一种发表和吸收 HTML页面包车型地铁措施。

HTTPS(Hypertext Transfer Protocol over Secure Socket
Layer)不难讲是HTTP的安全版,在HTTP下加入SSL层。

SSL(Secure Sockets Layer
安全套接层)主要用于Web的安全传输协议,在传输层对网络连接举办加密,保险在Internet上多少传输的林芝。

浏览器发送HTTP请求的经过:

  1. 当用户在浏览器的地点栏中输入3个U大切诺基L并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求首要分为“Get”和“Post”两种办法。

  2. 当我们在浏览器输入U普拉多L  的时候,浏览器发送一个Request请求去赢得  的html文件,服务器把Response文件对象发送回给浏览器。

  3. 浏览器分析Response中的
    HTML,发现中间引用了很多别样文件,比如Images文件,CSS文件,JS文件。
    浏览器会自动重新发送Request去取得图片,CSS文件,或然JS文件。

  4. 当有着的公文都下载成功后,网页会基于HTML语法结构,完整的显得出来了。

URL(Uniform / Universal Resource
Locator的缩写)

概念:统一能源定位符,是用于完整地讲述Internet上网页和其剩余资金源的地址的一种标识方法。

主导格式:scheme://host[:port#]/path/…/[?query-string][#anchor]

  • scheme:协议(例如:http, https, ftp)
  • host:服务器的IP地址大概域名
  • port#:服务器的端口(就算是走协议私下认可端口,缺省端口80)
  • path:访问财富的门径
  • query-string:参数,发送给http服务器的多少
  • anchor:锚(跳转到网页的钦点锚点地方)

客户端HTTP请求

U途睿欧L只是标识能源的岗位,而HTTP是用来交给和取得财富。客户端发送三个HTTP请求到服务器的伏乞音讯,包含以下格式:

请求行请求头部空行请求数据

三个典型的HTTP请求

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.4
Cookie: BAIDUID=AE4D1DA6B2D6689BB8C557B3436893E3:FG=1; BIDUPSID=AE4D1DA6B2D6689BB8C557B3436893E3; PSTM=1501466227; BD_UPN=12314353; BD_CK_SAM=1; PSINO=1; H_PS_PSSID=1420_25548_21080_20929; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDSVRTM=0

威尼斯人线上娱乐 1威尼斯人线上娱乐 2

1. Host (主机和端口号)

Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。
2. Connection (链接类型)

Connection:表示客户端与服务连接类型

    Client 发起一个包含 Connection:keep-alive 的请求,HTTP/1.1使用 keep-alive 为默认值。

    Server收到请求后:
        如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
        如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。

    如果client收到包含 Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。

keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。
3. Upgrade-Insecure-Requests (升级为HTTPS请求)

Upgrade-Insecure-Requests:升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。

HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。
4. User-Agent (浏览器名称)

User-Agent:是客户浏览器的名称,以后会详细讲。
5. Accept (传输文件类型)

Accept:指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根据它判断并返回适当的文件格式。
举例:

Accept: */*:表示什么都可以接收。

Accept:image/gif:表明客户端希望接受GIF图像格式的资源;

Accept:text/html:表明客户端希望接受html文本。

Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。

q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则用于表示浏览器不接受此内容类型。

Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。详细请点击
6. Referer (页面跳转处)

Referer:表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。

有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载;
7. Accept-Encoding(文件编解码格式)

Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。 如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
8. Accept-Language(语言种类)

Accept-Langeuage:指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。
9. Accept-Charset(字符编码)

Accept-Charset:指出浏览器可以接受的字符编码。
举例:Accept-Charset:iso-8859-1,gb2312,utf-8

    ISO8859-1:通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,英文浏览器的默认值是ISO-8859-1.
    gb2312:标准简体中文字符集;
    utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。

如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
10. Cookie (Cookie)

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能,以后会详细讲。
11. Content-Type (POST数据类型)

Content-Type:POST请求里用来表示的内容类型。
举例:Content-Type = Text/XML; charset=gb2312:

指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。

常用请求报头

威尼斯人线上娱乐 3威尼斯人线上娱乐 4

服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。

为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。

Cookie:通过在 客户端 记录的信息确定用户的身份。

Session:通过在 服务器端 记录的信息确定用户的身份。

cookie和session

HTTP请求方法

序号   方法      描述
1     GET       请求指定的页面信息,并返回实体主体。
2     HEAD      类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3     POST      向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4     PUT       从客户端向服务器传送的数据取代指定的文档的内容。
5     DELETE    请求服务器删除指定的页面。
6     CONNECT   HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7     OPTIONS   允许客户端查看服务器的性能。
8     TRACE     回显服务器收到的请求,主要用于测试或诊断。

器重方法get和post请求

  • GET是从服务器上获取数据,POST是向服务器传送数据

  • GET请求参数字彰显示,都来得在浏览器网址上,HTTP服务器依据该请求所富含U奥迪Q5L中的参数来发出响应内容,即“Get”请求的参数是U福睿斯L的一有的。
    例如: http://www.baidu.com/s?wd=Chinese

  • POST请求参数在请求体当中,音讯长度没有范围而且以隐式的点子开始展览发送,常常用来向HTTP服务器提交量相比较大的数量(比如请求中蕴涵众多参数只怕文件上传操作等),请求的参数包罗在“Content-Type”消息头里,指明该新闻体的媒体类型和编码.

HTTP响应状态码

威尼斯人线上娱乐 5威尼斯人线上娱乐 6

1xx:信息

100 Continue
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols
服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。



2xx:成功

200 OK
请求成功(其后是对GET和POST请求的应答文档)
201 Created
请求被创建完成,同时新的资源被创建。
202 Accepted
供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information
文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。
204 No Content
没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 Reset Content
没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。
206 Partial Content
客户发送了一个带有Range头的GET请求,服务器完成了它。



3xx:重定向

300 Multiple Choices
多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。
301 Moved Permanently
所请求的页面已经转移至新的url。
302 Moved Temporarily
所请求的页面已经临时转移至新的url。
303 See Other
所请求的页面可在别的url下被找到。
304 Not Modified
未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 Use Proxy
客户请求的文档应该通过Location头所指明的代理服务器提取。
306 Unused
此代码被用于前一版本。目前已不再使用,但是代码依然被保留。
307 Temporary Redirect
被请求的页面已经临时移至新的url。



4xx:客户端错误

400 Bad Request
服务器未能理解请求。
401 Unauthorized
被请求的页面需要用户名和密码。
401.1
登录失败。
401.2
服务器配置导致登录失败。
401.3
由于 ACL 对资源的限制而未获得授权。
401.4
筛选器授权失败。
401.5
ISAPI/CGI 应用程序授权失败。
401.7
访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。
402 Payment Required
此代码尚无法使用。
403 Forbidden
对被请求页面的访问被禁止。
403.1
执行访问被禁止。
403.2
读访问被禁止。
403.3
写访问被禁止。
403.4
要求 SSL。
403.5
要求 SSL 128。
403.6
IP 地址被拒绝。
403.7
要求客户端证书。
403.8
站点访问被拒绝。
403.9
用户数过多。
403.10
配置无效。
403.11
密码更改。
403.12
拒绝访问映射表。
403.13
客户端证书被吊销。
403.14
拒绝目录列表。
403.15
超出客户端访问许可。
403.16
客户端证书不受信任或无效。
403.17
客户端证书已过期或尚未生效。
403.18
在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。
403.19
不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。
403.20
Passport 登录失败。这个错误代码为 IIS 6.0 所专用。
404 Not Found
服务器无法找到被请求的页面。
404.0
没有找到文件或目录。
404.1
无法在所请求的端口上访问 Web 站点。
404.2
Web 服务扩展锁定策略阻止本请求。
404.3
MIME 映射策略阻止本请求。
405 Method Not Allowed
请求中指定的方法不被允许。
406 Not Acceptable
服务器生成的响应无法被客户端所接受。
407 Proxy Authentication Required
用户必须首先使用代理服务器进行验证,这样请求才会被处理。
408 Request Timeout
请求超出了服务器的等待时间。
409 Conflict
由于冲突,请求无法被完成。
410 Gone
被请求的页面不可用。
411 Length Required
"Content-Length" 未被定义。如果无此内容,服务器不会接受请求。
412 Precondition Failed
请求中的前提条件被服务器评估为失败。
413 Request Entity Too Large
由于所请求的实体的太大,服务器不会接受请求。
414 Request-url Too Long
由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。
415 Unsupported Media Type
由于媒介类型不被支持,服务器不会接受请求。
416 Requested Range Not Satisfiable
服务器不能满足客户在请求中指定的Range头。
417 Expectation Failed
执行失败。
423
锁定的错误。



5xx:服务器错误

500 Internal Server Error
请求未完成。服务器遇到不可预知的情况。
500.12
应用程序正忙于在 Web 服务器上重新启动。
500.13
Web 服务器太忙。
500.15
不允许直接请求 Global.asa。
500.16
UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18
URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100
内部 ASP 错误。
501 Not Implemented
请求未完成。服务器不支持所请求的功能。
502 Bad Gateway
请求未完成。服务器从上游服务器收到一个无效的响应。
502.1
CGI 应用程序超时。 ·
502.2
CGI 应用程序出错。
503 Service Unavailable
请求未完成。服务器临时过载或当机。
504 Gateway Timeout
网关超时。
505 HTTP Version Not Supported
服务器不支持请求中指明的HTTP协议版本

View Code

浏览器内核

浏览器                         内核
IE                           Trident
Chrome                       Webkit
Firefox                      Gecho
Opera                        Pesto
Safari(Apple)                Webkit 

HTTP代理工科具Fiddler
Fiddler是一款强大Web调节和测试工具,它能记录全部客户端和服务器的HTTP请求.
威尼斯人线上娱乐 7

Request部分详解

  1. Headers —— 呈现客户端发送到服务器的 HTTP 请求的
    header,呈现为二个分别视图,包涵了 Web
    客户端音信、Cookie、传输状态等。
  2. Textview —— 突显 POST 请求的 body 部分为文本。
  3. WebForms —— 展现请求的 GET 参数 和 POST body 内容。
  4. HexView —— 用十六进制数据呈现请求。
  5. Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和
    Authorization(授权) 音信.
  6. Raw —— 将整个请求展现为纯文本。
  7. JSON – 展现JSON格式文件。
  8. XML —— 如若请求的 body 是 XML 格式,正是用各自的 XML 树来突显它。

 Responser部分详解

  1. Transformer —— 呈现响应的编码消息。
  2. Headers —— 用分级视图展现响应的 header。
  3. TextView —— 使用文本突显相应的 body。
  4. ImageVies —— 假诺请求是图表财富,展现响应的图样。
  5. HexView —— 用十六进制数据体现响应。
  6. WebView —— 响应在 Web 浏览器中的预览效果。
  7. Auth —— 展现响应 header 中的 Proxy-Authorization(代理身份验证) 和
    Authorization(授权) 音信。
  8. Caching —— 显示此呼吁的缓存消息。
  9. Privacy —— 彰显此恳请的私密 (P3P) 音信。
  10. Raw —— 将整个响应展现为纯文本。
  11. JSON – 展现JSON格式文件。
  12. XML —— 假诺响应的 body 是 XML 格式,正是用各自的 XML 树来展现它 。

 领会了那么些文化后,接下去真正迈向爬虫之路…….

本篇将介绍urllib2的Get和Post方法,越多内容请参考:python学习指南

urllib2私下认可只接济HTTP/HTTPS的GET和POST方法

urllib2暗许只支持HTTP/HTTPS的GET和POST方法

urllib2

所谓网页抓取,正是把U福特ExplorerL地址中钦赐的网络财富从网络流中读取出来,保存到地面。
在Python中有诸多库能够用来抓取网页,先读书urllib2

urllib2模块直接导入就能够用,在python3中urllib2被改为urllib.request

开端爬虫须求预备的局部工具

(1)下载Fiddeler抓包工具,百度一向下载安装就能够(抓包)

(2)下载chrome浏览器代理插件 Proxy-SwitchyOmega(代理)

(3)下载chrome浏览器插件XPath(解析HTML)

(4)工具网站:

          
(json解析网站)

      
    (url编码解码网站)

先写个简易的爬虫百度页面

urlopen

# _*_ coding:utf-8 _*_
import urllib2

#向指定的url地址发送请求,并返回服务器响应的类文件对象
response = urllib2.urlopen('http://www.baidu.com/')
#服务器返回的类文件对象支持python文件对象的操作方法
#read()方法就是读取文件里的全部内容,返回字符串
html = response.read()
print html

urllib2私下认可的User-Agent是Python-urllib/2.7,不难被检查到是爬虫,所以大家要布局多个伸手对象,要用到request方法。

萧规曹随浏览器访问

浏览器访问时经过抓包工具获得的headers消息如下:

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.4
Cookie: BAIDUID=AE4D1DA6B2D6689BB8C557B3436893E3:FG=1; BIDUPSID=AE4D1DA6B2D6689BB8C557B3436893E3; PSTM=1501466227; BD_CK_SAM=1; PSINO=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_HOME=0; H_PS_PSSID=1420_25548_21080_20929; BD_UPN=12314353

我们要安装User-Agent模仿浏览器去拜谒数据

# _*_ coding:utf-8 _*_
import urllib2

# User-Agent是爬虫与反爬虫的第一步
ua_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
# 通过urllib2.Request()方法构造一个请求对象
request = urllib2.Request('http://www.baidu.com/',headers=ua_headers)

#向指定的url地址发送请求,并返回服务器响应的类文件对象
response = urllib2.urlopen(request)

# 服务器返回的类文件对象支持python文件对象的操作方法
# read()方法就是读取文件里的全部内容,返回字符串
html = response.read()

print html

Request总共四个参数,除了必要求有url参数,还有下边五个:

  1. data(暗许空):是伴随 url 提交的数额(比如要post的多少),同时 HTTP
    请求将从 “GET”格局 改为 “POST”格局。

  2. headers(私下认可空):是三个字典,包蕴了亟待发送的HTTP报头的键值对。

response的常用方法

# _*_ coding:utf-8 _*_
import urllib2

# User-Agent是爬虫与反爬虫的第一步
ua_headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
# 通过urllib2.Request()方法构造一个请求对象
request = urllib2.Request('http://www.baidu.com/',headers=ua_headers)

#向指定的url地址发送请求,并返回服务器响应的类文件对象
response = urllib2.urlopen(request)

# 服务器返回的类文件对象支持python文件对象的操作方法
# read()方法就是读取文件里的全部内容,返回字符串
html = response.read()

# 返回HTTP的响应吗,成功返回200,4服务器页面出错,5服务器问题
print response.getcode()     #200

# 返回数据的实际url,防止重定向
print response.geturl()     #https://www.baidu.com/

# 返回服务器响应的HTTP报头
print response.info()

# print html

私自行选购取一个Use-Agent

为了防止万一封IP,先生成二个user-agent列表,然后从中随机挑选二个

# _*_ coding:utf-8 _*_
import urllib2
import random

url = 'http:/www.baidu.com/'

# 可以试User-Agent列表,也可以是代理列表
ua_list = ["Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

# 在User-Agent列表中随机选择一个User-Agent
user_agent = random.choice(ua_list)

# 构造一个请求
request = urllib2.Request(url)

# add_header()方法添加/修改一个HTTP报头
request.add_header('User-Agent',user_agent)

#get_header()获取一个已有的HTTP报头的值,注意只能第一个字母大写,后面的要小写
print request.get_header('User-agent')

urllib2默许只帮忙HTTP/HTTPS的GET和POST方法

urllib.urlencode()

urllib 和 urllib2
都以经受U卡宴L请求的连带模块,可是提供了差别的作用。四个最醒目标例外如下:

  • urllib 仅可以接受U奥德赛L,不可能创建 设置了headers 的Request 类实例;
  • 不过 urllib 提供 urlencode 方法用来GET查询字符串的发生,而 urllib2
    则从未。(这是 urllib 和 urllib2 常常一同利用的根本原因)
  • 编码工作选拔urllib的urlencode()函数,帮大家将key:value那样的键值对转换到”key=value”那样的字符串,解码工作得以应用urllib的unquote()函数。(注意,不是urllib2.urlencode()
    )

貌似HTTP请求提交数据,须求编码成
U奥迪Q5L编码格式,然后做为url的一部分,恐怕作为参数字传送到Request对象中。

urllib 和 urllib2 都以接受URAV4L请求的相关模块,不过提供了不一致的效益。八个最醒目标两样如下:

  • urllib 仅能够承受U大切诺基L,不可能创立 设置了headers 的Request 类实例;

  • 只是 urllib 提供 urlencode 方法用来GET查询字符串的产生,而 urllib2
    则没有。(那是 urllib 和 urllib2 平时一起利用的显要原因)

  • 编码工作选取urllib的urlencode()函数,帮大家将key:value那样的键值对转换来”key=value”那样的字符串,解码工作能够运用urllib的unquote()函数。(注意,不是urllib2.urlencode()
    )

    IPython2 中的测试结果
    In [1]: import urllib
    
    In [2]: word = {"wd" : "传智播客"}
    
    # 通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能            被web服务器接受。
    In [3]: urllib.urlencode(word)  
    Out[3]:       "wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"
    
     # 通过urllib.unquote()方法,把 URL编码字符串,转换回原先字符串。
    In [4]: print urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2")
    wd=传智播客
    

urllib和urllib2的最首要差别

 urllib和urllib2都以经受U本田UR-VL请求的连带模块,可是提供了区别的作用,最鲜明的区分如下:

(1)urllib仅能够承受UHavalL,不能够创立,设置headers的request类实例;

(2)不过urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2则没有(那是urllib和urllib2常常一起利用的根本缘由)

(3)编码工作选取urllib的urlencode()函数,帮大家讲key:value那样的键值对转换到‘key=value’那样的字符串,解码工作得以选取urllib的unquote()

函数

 urllib.encode()的使用

urlencode()里面必须是字典类型

# _*_ coding:utf-8 _*_
import urllib

dic = {'derek':'编码'}
print urllib.urlencode(dic)    #derek=%E7%BC%96%E7%A0%81

m = urllib.urlencode(dic)

print urllib.unquote(m)         #derek=编码

urllib.urlencode()

urllib和urllib2都以承受U本田UR-VL请求的相干参数,可是提供了不一样的功效。七个最显眼的比不上如下:

  • urllib仅能够承受ULacrosseL,不可能创制设置了headers的Request类实例;
  • 但是urllib提供了urlencode措施用来GET查询字符串的发生,而urllib2则尚未。(那是urllib和urllib2平时一同行使的重中之重缘由)
  • 编码工作采用urllib的urlencode()函数,帮大家将key:value诸如此类的键值对转换来"key=value"那样的字符串,解码工作得以采纳urllib的unquote()函数。(注意,不是urllib.urlencode())
#-*- coding:utf-8 -*-
#06.urllib2_urlencode.py
import urllib2
import urllib

word = {"wd":"传智播客"}

#通过urllib.urlencode()方法,将字典键值对按URL编码转换,从而能被web服务器接受
encode = urllib.urlencode(word)

print(encode)
#通过urllib.unquote()方法,把URL编码字符串,转换回原始字符串

print(urllib.unquote("wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2"))

貌似HTTP请求提交数据,须求编码成U陆风X8L编码格式,然后作为url的一局地,大概当做参数字传送到Request对象中。

Get方式

import urllib      #负责url编码处理
import urllib2

url = "http://www.baidu.com/s"
value = raw_input("输入要查询的关键字:")
word = {"wd":value}

#转换成url编码格式(字符串)
word = urllib.urlencode(word) 

  # url首个分隔符就是 ?
newurl = url + "?" + word  

headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

request = urllib2.Request(newurl, headers=headers)

response = urllib2.urlopen(request)

print response.read()

诚如HTTP请求提交数据,需求编码成 U奇骏L编码格式,然后做为url的一局地,只怕作为参数传到Request对象中。

相似HTTP请求提交数据,要求编码成 UEvoqueL编码格式,然后做为url的一局地,只怕当作参数字传送到Request对象中。

GET请求一般用来大家向服务器获取数据,比如说,大家用百度查寻知乎

发现GET

威尼斯人线上娱乐 8

 

 

威尼斯人线上娱乐 9

威尼斯人线上娱乐 10

用urllib.urlencode()进行转码,然后组合url

# _*_ coding:utf-8 _*_
import urllib,urllib2

url = 'http://www.baidu.com/s'
headers = {'UserAgent':'Mozilla'}
keyword = raw_input('请输入关键字:')
wd = urllib.urlencode({'wd':keyword})
fullurl = url + '?' + wd
print fullurl
request = urllib2.Request(fullurl,headers=headers)
response = urllib2.urlopen(request)
print response.read()

下一场输加入关贸总协定组织键字,爬取下相应的剧情

威尼斯人线上娱乐 11

 威尼斯人线上娱乐 12

Get方式

Get请求一般用来大家向服务器获取数据,比如说,我们用百度搜索传智播客;https://www.baidu.com/s?wd=传智播客

浏览器的url会跳转如图所示
威尼斯人线上娱乐 13

在里面大家能够见见在呼吁部分里,http://www.baidu.com/s事后出现贰个长长的字符串,个中就带有作者门要询问的根本词传智播客,于是大家得以品味运用暗中同意的Get方式来发送请求。

#-*- coding:utf-8 -*-
#07.urllib2_get.py

import urllib
import urllib2

url = "http://www.baidu.com/s"
word = {"wd":"传智播客"}
word = urllib.urlencode(word) #转换成url编码格式(字符串)

newurl = url + "?" + word

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

request = urllib2.Request(newurl,headers = headers)

response = urllib2.urlopen(request)

print(response.read())

批量爬取贴吧页面数据

先是我们成立一个python文件,
tiebaSpider.py,我们要形成的是,输入一个百度贴吧的地点,比如:
百度贴吧LOL吧第③页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0
第二页:
http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50
第三页:
http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100
发现规律了啊,贴吧中每个页面不一样之处,就是url最终的pn的值,别的的都以相同的,大家得以引发这几个原理。

差不离写一个小爬虫程序,来爬取百度LOL吧的享有网页。

先写二个main,提醒用户输入要爬取的贴吧名,并用urllib.urlencode()举办转码,然后组合url,借使是lol吧,那么结合后的url就是:http://tieba.baidu.com/f?kw=lol

# coding:utf8
import urllib2
import urllib

def loadPage(url, filename):

    '''
        作用:根据url发送请求,获取服务器响应文件
        url:需要爬取的url地址
        filename: 文件名
    '''
    print "正在下载" + filename

    headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}

    request = urllib2.Request(url, headers = headers)
    response = urllib2.urlopen(request)
    return response.read()


def writeFile(html, filename):
    """
        作用:保存服务器响应文件到本地磁盘文件里
        html: 服务器响应文件
        filename: 本地磁盘文件名
    """
    print "正在存储" + filename
    with open(filename, 'w') as f:
        f.write(html)
    print "-" * 20


def tiebaSpider(url, beginPage, endPage):

    """
    作用:负责处理url,分配每个url去发送请求
        url:需要处理的第一个url
        beginPage: 爬虫执行的起始页面
        endPage: 爬虫执行的截止页面
    """


    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50

        filename = "第" + str(page) + "页.html"
        # 组合为完整的 url,并且pn值每次增加50
        fullurl = url + "&pn=" + str(pn)
        #print fullurl

        # 调用loadPage()发送请求获取HTML页面
        html = loadPage(fullurl, filename)
        # 将获取到的HTML页面写入本地磁盘文件
        writeFile(html, filename)


# 模拟 main 函数
if __name__ == "__main__":

    kw = raw_input("请输入需要爬取的贴吧:")
    # 输入起始页和终止页,str转成int类型
    beginPage = int(raw_input("请输入起始页:"))
    endPage = int(raw_input("请输入终止页:"))

    url = "http://tieba.baidu.com/f?"
    key = urllib.urlencode({"kw" : kw})

    # 组合后的url示例:http://tieba.baidu.com/f?kw=lol
    url = url + key
    tiebaSpider(url, beginPage, endPage)

实质上过多网站都以如此的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发觉规律就能够批量爬取页面了。

Get方式

GET请求一般用来大家向服务器获取数据,比如说,大家用百度查寻传智播客:https://www.baidu.com/s?wd=传智播客

浏览器的url会跳转成如图所示:

威尼斯人线上娱乐 14

image.png

https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

在里头大家能够看到在伸手部分里,http://www.baidu.com/s?
之后现身2个长长的字符串,个中就含有大家要询问的第1词传智播客,于是我们能够品尝用默许的Get格局来发送请求。

urllib2_get.py

import urllib      #负责url编码处理
import urllib2

url = "http://www.baidu.com/s"
word = {"wd":"传智播客"}
word = urllib.urlencode(word) #转换成url编码格式(字符串)
newurl = url + "?" + word    # url首个分隔符就是 ?

headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

request = urllib2.Request(newurl, headers=headers)

response = urllib2.urlopen(request)

 print response.read()

爬取贴吧内容

 先精晓贴吧url组成:

威尼斯人线上娱乐 15

各种贴吧url都以以’ kw=‘’贴吧名字‘’,再前面是 &pn=页数
 (pn=0第2页,pn=四十陆次之页,依次类推)

1.先写1个main,提醒用户输入要爬取的贴吧名,并用urllib.urlencode()进行转码,然后组合url

2.接下来,写二个百度贴吧爬虫接口tiebaSpider(),需求传递3个参数给这一个接口,
2个是main里组合的url地址,以及开首页码和停止页码,表示要爬取页码的限量。

3.前边写出八个爬取贰个网页的代码。然后,将它封装成三个小函数loadPage(),供大家选取。

4.将爬取到的每页的信息存款和储蓄在地面磁盘上,大家能够省略写一个储存文件的接口writePage()

# _*_ coding:utf-8 _*_
import urllib,urllib2

def loadPage(url,filename):
    #根据url发送请求,获取服务器响应文件
    print '正在下载' + filename
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
    request = urllib2.Request(url,headers = headers)
    content = urllib2.urlopen(request).read()
    return content
def writePage(html,filename):
    #将html内容写入到本地
    print '正在保存' + filename
    with open(unicode(filename,'utf-8'),'w') as f:
        f.write(html)
    print '_' * 30

def tiebaSpider(url,beginPage,endPage):
    #贴吧爬虫调度器,负责组合处理每个页面的url
    for page in range(beginPage,endPage + 1):
        pn = (page - 1) * 50
        filename = '第' + str(page) + '页.html'
        fullurl = url + '&pn=' + str(pn)
        # print fullurl
        html = loadPage(fullurl,filename)
        writePage(html,filename)

if __name__ == '__main__':
    kw = raw_input('请输入贴吧名:')
    beginPage = int(raw_input('请输入起始页:'))
    endPage = int(raw_input('请输入结束页:'))

    url = 'https://tieba.baidu.com/f?'
    key = urllib.urlencode({'kw':kw})
    fullurl = url + key
    tiebaSpider(fullurl,beginPage,endPage)

由此输入想要搜索的贴吧名字,爬取内容并保存到本地

威尼斯人线上娱乐 16

批量爬取贴吧页面数据

首先大家创制叁个python文件,tiebaSpider.py,大家要水到渠成的是,输入二个百度贴吧的地点,比如:
百度贴吧LOL吧第3页:[](

第二页:[](

第二页:[](

察觉规律了吗,贴吧中每一个页面区别之处,正是url最后的pn的值,别的的都以如出一辙的,大家能够挑动这一个原理。

简单易行写二个小爬虫程序,来爬虫百度LOL吧的全体网页

  • 先写二个main,提醒用户输入要爬取的贴吧名,并用urllib.urlencode()实行转码,然后组合url,假诺是lol吧,那么结合的url正是:
    http://tieba.baidu.com/f?kw=lol

    # 模拟 main 函数
    if name == “main“:

    kw = raw_input("请输入需要爬取的贴吧:")
    # 输入起始页和终止页,str转成int类型
    beginPage = int(raw_input("请输入起始页:"))
    endPage = int(raw_input("请输入终止页:"))
    
    url = "http://tieba.baidu.com/f?"
    key = urllib.urlencode({"kw" : kw})
    
    # 组合后的url示例:http://tieba.baidu.com/f?kw=lol
    url = url + key
    tiebaSpider(url, beginPage, endPage)
    
  • 接下去,我们写一个百度贴吧爬虫接口,我们要求传递三个参数给那个接口,叁个是main里组合url地址,以及开首页和平息页码
    ,表示要爬取页码的范围。

    def tiebaSpider(url, beginPage, endPage):

    """
        作用:负责处理url,分配每个url去发送请求
        url:需要处理的第一个url
        beginPage: 爬虫执行的起始页面
        endPage: 爬虫执行的截止页面
    """
    
    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50

        filename = "第" + str(page) + "页.html"
        # 组合为完整的 url,并且pn值每次增加50
        fullurl = url + "&pn=" + str(pn)
        #print fullurl

        # 调用loadPage()发送请求获取HTML页面
        html = loadPage(fullurl, filename)
        # 将获取到的HTML页面写入本地磁盘文件
        writeFile(html, filename)
  • 咱俩早就此前写出3个爬取两个网页的代码。以往,大家能够把它封装成贰个loadPage,供大家接纳。

    def loadPage(url, filename):

    '''
        作用:根据url发送请求,获取服务器响应文件
        url:需要爬取的url地址
        filename: 文件名
    '''
    print "正在下载" + filename
    
    headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
    
    request = urllib2.Request(url, headers = headers)
    response = urllib2.urlopen(request)
    return response.read()
    
  • 最后只要我们盼望将爬取到了每页的新闻存款和储蓄在当地球磁性盘上,咱们能够回顾写二个仓库储存文件的接口。

    def writeFile(html, filename):

    """
        作用:保存服务器响应文件到本地磁盘文件里
        html: 服务器响应文件
        filename: 本地磁盘文件名
    """
    print "正在存储" + filename
    with open(filename, 'w') as f:
        f.write(html)
    print "-" * 20
    

实在过多网站都以如此的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发觉规律就能够批量爬取页面了。

POST方式:

下面我们说了Request请求对象的里有data参数,它正是用在POST里的,大家要传递的数目正是这几个参数data,data是1个字典,里面要匹配键值对。

# coding:utf8

import urllib
import urllib2

# POST请求的目标URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers={"User-Agent": "Mozilla...."}

formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)
print response.read()

出殡POST请求时,必要尤其注意headers的一些品质:

Content-Length: 144:
是指发送的表单数据长度为144,也正是字符个数是14一个。
X-Requested-With: XMLHttpRequest :表示Ajax异步请求。
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web
表单时选择,表单数据会根据 name1=value1&name2=value2
键值对格局举办编码。

批量爬取贴吧页面数据

先是大家创设二个python文件,
tiebaSpider.py,大家要完结的是,输入二个百度贴吧的地址,比如:

百度贴吧LOL吧第①页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0

第二页:
http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=50

第三页:
http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=100

意识规律了啊,贴吧中每一种页面分化之处,便是url最后的pn的值,其他的都以千篇一律的,大家得以吸引那个原理。

 获取Ajax方式加载的数量

爬虫最急需关爱的不是页面音信,而是页面音讯的数额出自

Ajax方式加载的页面,数据出自一定是JSON,直接对AJAX地址进行post或get,获得JSON,正是得到了网页数据,

(1)先经过浏览器访问豆瓣电影排名榜

 威尼斯人线上娱乐 17

(2)浏览器访问后,通过抓包工具就能够得到我们想要的局地音讯

 威尼斯人线上娱乐 18

威尼斯人线上娱乐 19

比方response里面有
JSON数据,大家就可以找到服务器的多少来自

分析发现变动的是start value和limit value,
type,interval_id,action,固定不变,那七个url中早已包涵了,所以formdata只用传start和limit

import urllib
import urllib2


url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action='
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}

# start和limit可以自己随便设置
formdata = {'start':'20','limit':'100'}

data = urllib.urlencode(formdata)
request = urllib2.Request(url,data = data,headers=headers)

response = urllib2.urlopen(request)
print response.read()

 

POST方式:

上面大家说了Request请求对象里有data参数,它正是用在POST里,我们要传递的数码正是其一参数data,data是三个字典,里面要匹配键值对。

获取AJAX加载的剧情

稍微网页内容使用AJAX加载,只要记得,AJAX一般重临的是JSON,直接对AJAX地址进行post或get,就回来JSON数据了。

“作为一名爬虫工程师,你最须求关切的,是数量的来源”

# coding: utf8

import urllib
import urllib2

# demo1

url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 变动的是这两个参数,从start开始往后显示limit个
formdata = {
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()


# demo2

url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 处理所有参数
formdata = {
    'type':'11',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()
粗略写四个小爬虫程序,来爬取百度LOL吧的装有网页。
  • 先写三个main,提醒用户输入要爬取的贴吧名,并用urllib.urlencode()进行转码,然后组合url,借使是lol吧,那么结合后的url正是:http://tieba.baidu.com/f?kw=lol

     #模拟 main 函数
     if __name__ == "__main__":
    
    kw = raw_input("请输入需要爬取的贴吧:")
    # 输入起始页和终止页,str转成int类型
    beginPage = int(raw_input("请输入起始页:"))
    endPage = int(raw_input("请输入终止页:"))
    
    url = "http://tieba.baidu.com/f?"
    key = urllib.urlencode({"kw" : kw})
    
    # 组合后的url示例:http://tieba.baidu.com/f?kw=lol
    url = url + key
    tiebaSpider(url, beginPage, endPage)
    
  • 接下去,大家写贰个百度贴吧爬虫接口,我们供给传递三个参数给这么些接口,
    二个是main里组合的url地址,以及初步页码和平息页码,表示要爬取页码的限定。

    def tiebaSpider(url, beginPage, endPage):
    """
      作用:负责处理url,分配每个url去发送请求
      url:需要处理的第一个url
      beginPage: 爬虫执行的起始页面
      endPage: 爬虫执行的截止页面
    """
    
    for page in range(beginPage, endPage + 1):
        pn = (page - 1) * 50

      filename = "第" + str(page) + "页.html"
      # 组合为完整的 url,并且pn值每次增加50
      fullurl = url + "&pn=" + str(pn)
      #print fullurl

      # 调用loadPage()发送请求获取HTML页面
      html = loadPage(fullurl, filename)
      # 将获取到的HTML页面写入本地磁盘文件
      writeFile(html, filename)
  • 作者们早就以前写出一个爬取3个网页的代码。今后,大家能够将它封装成一个小函数loadPage,供大家选拔。

    def loadPage(url, filename):
      '''
      作用:根据url发送请求,获取服务器响应文件
      url:需要爬取的url地址
      filename: 文件名
      '''
      print "正在下载" + filename
    
      headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
    
    request = urllib2.Request(url, headers = headers)
    response = urllib2.urlopen(request)
    return response.read()
    
  • 说到底只要大家期望将爬取到了每页的新闻存款和储蓄在地头磁盘上,我们能够大致写叁个仓库储存文件的接口。

     def writeFile(html, filename):
     """
         作用:保存服务器响应文件到本地磁盘文件里
       html: 服务器响应文件
     filename: 本地磁盘文件名
     """
     print "正在存储" + filename
     with open(filename, 'w') as f:
         f.write(html)
     print "-" * 20
    

骨子里过多网站都以如此的,同类网站下的html页面编号,分别对应网址后的网页序号,只要发觉规律就能够批量爬取页面了。

有道词典翻译网站:

输入测试数据,再通过动用Fiddler观看,个中有一条是POST请求,而向服务器发送的央浼数据并不是在url里,那么大家能够试着模拟那些POST请求。
威尼斯人线上娱乐 20
于是乎,大家能够品尝用POST格局发送请求。

#-*- coding:utf-8 -*-
#09.urllib2_post.py

import urllib
import urllib2

#POST请求的目标URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers = {"User-Agent":"Mozilla...."}

formate = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyform":"fanyi.web",
    "ue":"utf-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.urlencode(formate)

request = urllib2.Request(url, data=data, headers = headers)

response = urllib2.urlopen(request)

print("-"*30)
print(response.read())

出殡POST请求时,须要特别注意headers的一些品质:

Content-Length:是指发送的表单数据长度为144,也便是字符个数是1四十二个;
X-Requested-With:表示Ajax异步请求。
Content-Type: application/x-www-form-urlencoded:表示浏览器提交web表单时,表单数据会遵照name1=value1&name2=value2键值对方式开始展览编码。

拍卖HTTPS请求 SSL证书验证

到现在到处都是 https 开首的网站,urllib2可以为 HTTPS
请求验证SSL证书,就如web浏览器同样,假设网站的SSL证书是因而CA认证的,则能够正常访问,如:威尼斯人线上娱乐,https://www.baidu.com/
等…
设若SSL证书验证不通过,大概操作系统不信任服务器的平安表明,比如浏览器在拜访12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(据他们说12306 网站证书是本人做的,没有通过CA认证)

威尼斯人线上娱乐 21

12306zhengshu.png

urllib2在做客的时候则会报出SSLError:

# coding: utf8

import urllib2

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

response = urllib2.urlopen(request)

print response.read()

运维结果:

urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

从而,假若之后蒙受那种网站,我们须要独自处理SSL证书,让程序忽略SSL证书验证错误,即可平常访问。

import urllib
import urllib2
# 1. 导入Python SSL处理模块
import ssl

# 2. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

# 3. 在urlopen()方法里 指明添加 context 参数
response = urllib2.urlopen(request, context = context)

print response.read()

POST方式:

地点我们说了Request请求对象的里有data参数,它正是用在POST里的,大家要传送的数量正是其一参数data,data是1个字典,里面要匹配键值对。

获取AJAX加载的始末

稍加网页内容使用AJAX加载,只要记得,AJAX一般重临的是JSON,直接对AJAX地址进行post或get,就回到JSON数据了。
“作为一名爬虫工程师,你最亟需关怀的,是多少的源于了。”

#-*- coding:utf-8 -*-
#10.urllib2_ajax.py
import urllib
import urllib2

# demo1

url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 变动的是这两个参数,从start开始往后显示limit个
formdata = {
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print(response.read())


#demo2
url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 处理所有参数
formdata = {
    'type':'11',
    'interval_id':'100:90',
    'action':'',
    'start':'0',
    'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()

关于CA

CA(Certificate
Authority)是数字证书认证大旨的简称,是指发放、管理、撤除数字证书的受依赖的第②方机构,如京师数字印证股份有限集团、东京市数字证书认证核心有限公司等…
CA的效果是反省注脚持有者身份的合法性,并签发证书,避防证书被冒用或歪曲,以及对证件和密钥举办保管。
现实生活中可以用身份证来证实身份,
那么在网络世界里,数字证书就是身份证。和现实生活不相同的是,并不是各样上网的用户都有数字证书的,往往只有当一人需求注明本人的地位的时候才须求用到数字证书。
普通用户一般是不必要,因为网站并不珍重是何人访问了网站,现在的网站只关怀流量。但是转头,网站就供给表明自个儿的地位了。
比如说以后钓鱼网站很多的,比如您想拜会的是www.baidu.com,但实则您拜访的是www.daibu.com”,所以在提交本身的隐衷音讯从前须求证实一下网站的身价,须要网站展现数字证书。
貌似正常的网站都会主动出示本人的数字证书,来确定保证客户端和网站服务器之间的通讯数据是加密安全的。

有道词典翻译网站:

输入测试数据,再经过应用Fiddler观看,在这之中有一条是POST请求,而向服务器发送的乞请数据并不是在url里,那么我们得以试着模拟那么些POST请求。

威尼斯人线上娱乐 22

image.png

于是,大家能够尝试用POST格局发送请求。

import urllib
import urllib2

# POST请求的目标URL
url = "http://fanyi.youdao.com/translate?        smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers={"User-Agent": "Mozilla...."}

formdata = {
"type":"AUTO",
"i":"i love python",
"doctype":"json",
"xmlVersion":"1.8",
"keyfrom":"fanyi.web",
"ue":"UTF-8",
"action":"FY_BY_ENTER",
"typoResult":"true"
}

data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)
print response.read()

题材:为何有时候POST也能在ULANDL内见到数据?

  • GET格局是以直接以链接格局拜访,链接中富含了全部参数,服务器端用Request.QueryString获取变量的值。假若带有了密码的话是一种不安全的抉择,但是你能够直观地观看本身付出了如何内容。
  • POST则不会在网址上出示全部的参数,服务器端用Request.Form获取提交的数额,在Form提交的时候。可是HTML代码里即使不点名method属性,则默许为GET请求,Form中提交的数据将会叠加在url之后,以?与url分开

    • 表单数据足以当做UKugaL字段(method=”get”)或许HTTP
      POST(method=”post”)的格局来发送。比如在底下的HTML代码中,表单数据将因为(method=”get”)而增大到U福睿斯L上;
    <form action="form_action.asp" method="get">
    <p>First name: <input type="text" name="fname" /></p>
    <p>Last name: <input type="text" name="lname" /></p>
    <input type="submit" value="Submit" />
    </form>
    

威尼斯人线上娱乐 23

发送POST请求时,须求尤其注意headers的一对属性:

Content-Length: 144:
是指发送的表单数据长度为144,也正是字符个数是142个。

X-Requested-With: XMLHttpRequest :表示Ajax异步请求。

Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web
表单时选择,表单数据会根据 name1=value1&name2=value2
键值对格局进行编码。

拍卖HTTPS请求SSL证书验证

今日随处可遇https先河的网站,urllib2能够为HTTPS请求验证SSL证书,就如web浏览器同样,要是网站的SSL证书是经过CA认证的,则能够寻常访问,如https://www.baidu.com/
一旦SSL证书验证不经过,或然操作系统不信任服务器的安全证书,比如浏览器在造访12306网站如:”https://www.12306.cn/normhweb/”的时候,会警告用户证书不受信任。(传闻12306网络证书是友好的,没有通过CA认证)
威尼斯人线上娱乐 24
urllib2在拜访的时候则会报出SSLError:

import urllib2

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

response = urllib2.urlopen(request)

print(response.read())

运维结果:
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
为此,若是之后遇到那种网站,大家须要独自处理SSL证书,让程序忽略SSL证书验证错误,即可符合规律访问。

import urllib
import urllib2
# 1. 导入Python SSL处理模块
import ssl

# 2. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

# 3. 在urlopen()方法里 指明添加 context 参数
response = urllib2.urlopen(request, context = context)

print response.read()

获得AJAX加载的情节

有点网页内容使用AJAX加载,只要记得,AJAX一般重回的是JSON,直接对AJAX地址进行post或get,就重返JSON数据了。

“作为一名爬虫工程师,你最须要关心的,是数据的源于”
import urllib
import urllib2

# demo1

url = "https://movie.douban.com/j/chart/top_list?      type=11&interval_id=100%3A90&action"

headers={"User-Agent": "Mozilla...."}

# 变动的是这两个参数,从start开始往后显示limit个
formdata = {
'start':'0',
'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()


# demo2

url = "https://movie.douban.com/j/chart/top_list?"
headers={"User-Agent": "Mozilla...."}

# 处理所有参数
formdata = {
'type':'11',
'interval_id':'100:90',
'action':'',
'start':'0',
'limit':'10'
}
data = urllib.urlencode(formdata)

request = urllib2.Request(url, data = data, headers = headers)
response = urllib2.urlopen(request)

print response.read()

关于CA

CA(Certificate
Authority)是数字证书认证中央的简称,是指发放、管理、撤废数字证书的受重视的第3方单位,如Hong Kong数字认证股份有限公司、东京市数字证书认证宗旨有限公司等…

CA的功效是反省表明持有者身份的合法性,并签发证书,防止证书被冒用或歪曲,以及对证件和密钥举办政管理制。

现实生活中能够用身份证来验证身份,
那么在网络世界里,数字证书便是身份证。和现实生活不一样的是,并不是各种上网的用户都有数字证书的,往往唯有当一位索要验证本身的身价的时候才必要用到数字证书。

普通用户一般是不必要,因为网站并不拥戴是哪个人访问了网站,未来的网站只关注流量。不过反过来,网站就供给证实自个儿的地点了。

譬如说今后钓鱼网站很多的,比如你想访问的是www.baidu.com,但实际您拜访的是www.daibu.com”,所以在提交本人的苦衷音信以前供给证实一下网站的地方,供给网站展现数字证书。

貌似平常的网站都会主动出示自身的数字证书,来确定保障客户端和网站服务器之间的通讯数据是加密安全的。

难点:为什么有时候POST也能在U奥迪Q5L内看到数据?

  • GET格局是直接以链接情势拜访,链接中蕴藏了颇具的参数,服务器端用Request.QueryString获取变量的值。若是带有了密码的话是一种不安全的精选,但是你能够直观地看出本身付出了什么内容。

  • POST则不会在网址上展现全部的参数,服务器端用Request.Form获取提交的数码,在Form提交的时候。不过HTML代码里尽管不点名
    method
    属性,则默许为GET请求,Form中付出的多寡将会附加在url之后,以?分开与url分开。

  • 表单数据足以看做 ULX570L 字段(method=”get”)恐怕 HTTP POST
    (method=”post”)的主意来发送。比如在底下的HTML代码中,表单数据将因为
    (method=”get”) 而增大到 U福睿斯L 上:

      <form action="form_action.asp" method="get">
          <p>First name: <input type="text" name="fname" /></p>
          <p>Last name: <input type="text" name="lname" /></p>
          <input type="submit" value="Submit" />
      </form>
    

威尼斯人线上娱乐 25

image.png

参考

  1. 破解有道翻译反爬虫机制
  2. 浏览器验证网站数字证书的流程

处理HTTPS请求 SSL证书验证

于今处处可知 https 伊始的网站,urllib2能够为 HTTPS
请求验证SSL证书,就像是web浏览器同样,若是网站的SSL证书是通过CA认证的,则能够健康访问,如:https://www.baidu.com/等…

威尼斯人线上娱乐 26

image.png

假如SSL证书验证不通过,恐怕操作系统不信任服务器的平安声明,比如浏览器在造访12306网站如:https://www.12306.cn/mormhweb/的时候,会警告用户证书不受信任。(据他们说12306 网站证书是自身做的,没有经过CA认证)
urllib2在做客的时候则会报出SSLError:
import urllib2

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

response = urllib2.urlopen(request)

print response.read()

运作结果:

  urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

因而,假诺现在蒙受那种网站,大家要求单独处理SSL证书,让程序忽略SSL证书验证错误,即可符合规律访问。

 import urllib
import urllib2
# 1. 导入Python SSL处理模块
import ssl

# 2. 表示忽略未经核实的SSL证书认证
context = ssl._create_unverified_context()

url = "https://www.12306.cn/mormhweb/"

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)         
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

request = urllib2.Request(url, headers = headers)

# 3. 在urlopen()方法里 指明添加 context 参数
response = urllib2.urlopen(request, context = context)

print response.read()

关于CA

CA(Certificate
Authority)是数字证书认证中央的简称,是指发放、管理、撤销数字证书的受正视的第③方单位,如法国首都市数字作证股份股份两合公司、北京市数字证书认证主题有限企业等…

CA的效益是检查评释持有者身份的合法性,并签发证书,防止证书被仿制假冒或歪曲,以及对表明和密钥进行管制。

现实生活中能够用身份证来表达身份,
那么在网络世界里,数字证书正是身份证。和现实生活差别的是,并不是每一个上网的用户都有数字证书的,往往唯有当一人必要验证自个儿的身价的时候才供给用到数字证书。

普通用户一般是不要求,因为网站并不关心是何人访问了网站,今后的网站只关注流量。但是转头,网站就须求证实本人的身价了。

例如现在钓鱼网站很多的,比如您想拜会的是www.baidu.com,但实际您拜访的是www.daibu.com”,所以在付出本人的心事新闻在此以前要求说圣元(Synutra)下网站的身份,供给网站显示数字证书。

诚如平日的网站都会积极性出示自个儿的数字证书,来确定保障客户端和网站服务器之间的通讯数据是加密安全的。


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图