威尼斯人线上娱乐

python爬虫入门,抓取Tmall商品

21 4月 , 2019  

以网易为例,接下去用Python来效仿这个Ajax请求,把本身发过的搜狐爬取下来。

芝麻HTTP:Ajax结果提取,芝麻ajax结果提取

以微博为例,接下去用Python来模拟这么些Ajax请求,把自家发过的博客园爬取下来。

招待关心天善智能
hellobi.com,大家是专注于商业智能BI,大额,数据解析世界的垂直社区,学习、问答、求职,一站式消除!

爬虫简要介绍

 什么是爬虫?

爬虫:正是抓取网页数据的程序。

HTTP和HTTPS

HTTP协议(HyperText Transfer
Protocol,超文本传输协议):是1种公布和收取 HTML页面包车型客车方法。

HTTPS(Hypertext Transfer Protocol over Secure Socket
Layer)轻便讲是HTTP的安全版,在HTTP下参预SSL层。

SSL(Secure Sockets Layer
保险套接层)重要用来Web的平安传输协议,在传输层对互联网连接进行加密,保障在Internet上数据传输的安全。

浏览器发送HTTP请求的进程:

  1. 当用户在浏览器的地方栏中输入三个UPAJEROL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求紧要分为“Get”和“Post”三种方法。

  2. 当大家在浏览器输入UTiggoL  的时候,浏览器发送贰个Request请求去获得  的html文件,服务器把Response文件对象发送回给浏览器。

  3. 浏览器分析Response中的
    HTML,发掘在这之中引用了重重其余文件,比如Images文件,CSS文件,JS文件。
    浏览器会自行重新发送Request去赢得图片,CSS文件,只怕JS文件。

  4. 当全体的文本都下载成功后,网页会依附HTML语法结构,完整的显示出来了。

URL(Uniform / Universal Resource
Locator的缩写)

概念:统壹财富定位符,是用以完整地描述Internet上网页和其余能源的地方的1种标志方法。

宗旨格式: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是向服务器传送数据

  • python爬虫入门,抓取Tmall商品。GET请求参数字展现示,都映今后浏览器网站上,HTTP服务器依据该请求所涵盖UENVISIONL中的参数来发出响应内容,即“Get”请求的参数是U景逸SUVL的一有的。
    比如: 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是1款庞大Web调节和测试工具,它能记录全部客户端和服务器的HTTP请求.
威尼斯人线上娱乐 7

Request部分详解

  1. Headers —— 展现客户端发送到服务器的 HTTP 请求的
    header,展现为2个分别视图,包涵了 Web
    客户端音信、Cookie、传输状态等。
  2. Textview —— 显示 POST 请求的 body 部分为文本。
  3. WebForms —— 彰显请求的 GET 参数 和 POST body 内容。
  4. HexView —— 用十6进制数据显示请求。
  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进制数据彰显响应。
  6. WebView —— 响应在 Web 浏览器中的预览效果。
  7. Auth —— 突显响应 header 中的 Proxy-Authorization(代理身份验证) 和
    Authorization(授权) 新闻。
  8. Caching —— 显示此恳请的缓存音信。
  9. Privacy —— 突显此恳请的私密 (P叁P) 新闻。
  10. Raw —— 将整个响应展现为纯文本。
  11. JSON – 展现JSON格式文件。
  12. XML —— 假如响应的 body 是 XML 格式,正是用各自的 XML 树来展现它 。

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

一. 解析请求

展开Ajax的XH智跑过滤器,然后直接滑动页面以加载新的天涯论坛内容。能够看来,会持续有Ajax请求发出。

选定当中3个呼吁,分析它的参数新闻。点击该请求,进入详细情况页面,如图陆-11所示。

威尼斯人线上娱乐 8

可以窥见,那是贰个GET类型的乞请,请求链接为[

随即再看看其余请求,能够发掘,它们的typevaluecontainerid慎始而敬终。type始终为uidvalue的值正是页面链接中的数字,其实那便是用户的id。另外,还有containerid。能够窥见,它正是10760三加上用户id。改换的值正是page,很显明那个参数是用来调节分页的,page=1代表首先页,page=2意味着第2页,就那样类推。

一. 剖析请求

开垦Ajax的XHCRUISER过滤器,然后直接滑动页面以加载新的今日头条内容。能够见到,会不断有Ajax请求发出。

选定个中二个请求,分析它的参数消息。点击该请求,进入详细情况页面,如图6-11所示。

威尼斯人线上娱乐 9

能够窥见,那是二个GET类型的伸手,请求链接为[

接着再看看别的请求,能够开掘,它们的typevaluecontainerid善始善终。type始终为uidvalue的值便是页面链接中的数字,其实那正是用户的id。另外,还有containerid。能够窥见,它正是十7603增加用户id。退换的值正是page,很醒目这一个参数是用来支配分页的,page=1意味着第3页,page=2代表第三页,依此类推。

对商业贸易智能BI、大数据解析开掘、机器学习,python,ENVISION等数码领域感兴趣的同桌加微信:tstoutiao,特邀您进来数据爱好者沟通群,数据爱好者们都在那儿。

urllib2

所谓网页抓取,正是把UTiguanL地址中钦命的互连网能源从互联网流中读收取来,保存到地头。
在Python中有不少库能够用来抓取网页,先读书urllib2

urllib二模块直接导入就可以用,在python三中urllib2被改为urllib.request

起初爬虫必要打算的局地工具

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

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

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

(肆)工具网址:

          
(json解析网址)

      
    (url编码解码网址)

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

urlopen

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

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

urllib二暗许的User-Agent是Python-urllib/2.柒,轻松被检查到是爬虫,所以我们要布局2个伸手对象,要用到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(默许空):是1个字典,包蕴了亟需发送的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,先生成3个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')

二. 解析响应

随之,观看那么些请求的响应内容,如图6-1二所示。

威尼斯人线上娱乐 10

本条故事情节是JSON格式的,浏览器开垦者工具自动做了分析以有利于大家查阅。能够观察,最根本的两部分消息便是cardlistInfocards:前者带有2个相比较根本的新闻total,观看后方可开采,它实际上是和讯的总的数量据,大家得以依赖那么些数字来打量分页数;后者则是1个列表,它包含12个成分,张开内部3个看一下,如图所示。

威尼斯人线上娱乐 11

能够窥见,这几个成分有贰个相比较关键的字段mblog。打开它,可以开掘它包涵的就是博客园的一些新闻,举例attitudes_count(赞数目)、comments_count(谈论数目)、reposts_count(转载数量)、created_at(公布时间)、text(和讯正文)等,而且它们都是局地格式化的内容。

那样大家请求2个接口,就足以博得10条和讯,而且请求时只要求转移page参数就能够。

那样的话,大家只需求简单做3个循环,就足以得到具有博客园了。

二. 分析响应

继之,观望那个请求的响应内容,如图陆-1二所示。

威尼斯人线上娱乐 12

其1剧情是JSON格式的,浏览器开垦者工具自动做了剖析以福利大家查阅。能够看来,最重大的两有些新闻就是cardlistInfocards:前者带有三个相比较关键的新闻total,旁观后能够开掘,它实在是新浪的总量据,我们得以依附那么些数字来揣度分页数;后者则是3个列表,它含有12个因素,张开内部三个看一下,如图所示。

威尼斯人线上娱乐 13

能够开掘,那么些成分有贰个相比首要的字段mblog。展开它,能够发现它富含的难为乐乎的1部分消息,例如attitudes_count(赞数目)、comments_count(商酌数目)、reposts_count(转载数量)、created_at(发表时间)、text(天涯论坛正文)等,而且它们皆以某个格式化的剧情。

如此那般大家恳请三个接口,就能够获得十条今日头条,而且请求时只须要转移page参数就能够。

那样的话,大家只要求轻松做一个循环往复,就能够收获具备乐乎了。

大家得以品味分析Ajax来抓取了连带数据,但是并不是具备的页面都是足以分析Ajax来就足以做到抓取的,比方Taobao。它的漫天页面数据确实也是通过Ajax获取的,不过那一个Ajax接口参数比较复杂,大概会含有加密密钥等参数,所以大家假如想本身组织Ajax参数是比较不方便的,对于那种页面我们最方便快速的抓取方法就是经过Selenium,本节大家就来用Selenium来模拟浏览器操作,抓取天猫的商品音讯,并将结果保存到MongoDB。

urllib和urllib2的基本点分裂

 urllib和urllib二都以接受U奥迪Q伍L请求的连锁模块,可是提供了不一致的功能,最分明的界别如下:

(一)urllib仅尚可U陆风X8L,不能够创制,设置headers的request类实例;

(二)但是urllib提供urlencode()方法用来GET查询字符串的发生,而urllib2则并未有(那是urllib和urllib二平常一齐行使的最主因)

(三)编码工作选用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=编码

三. 实战演练

此间大家用程序模拟这么些Ajax请求,将本身的前拾页今日头条全体爬取下来。

率先,定义一个办法来收获每便请求的结果。在伸手时,page是二个可变参数,所以大家将它看做艺术的参数字传送递进来,相关代码如下:

from urllib.parse import urlencode
import requests
base_url = 'https://m.weibo.cn/api/container/getIndex?'

headers = {
    'Host': 'm.weibo.cn',
    'Referer': 'https://m.weibo.cn/u/2830678474',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

def get_page(page):
    params = {
        'type': 'uid',
        'value': '2830678474',
        'containerid': '1076032830678474',
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

首先,那里定义了base_url来表示请求的UCR-VL的前半有的。接下来,构造参数字典,在那之中typevaluecontainerid是原则性参数,page是可变参数。接下来,调用urlencode()威尼斯人线上娱乐,格局将参数转化为URubiconL的GET请求参数,即类似于type=uid&value=2830678474&containerid=1076032830678474&page=2如此的格局。随后,base_url与参数拼合产生贰个新的U中华VL。接着,大家用requests请求那一个链接,参预headers参数。然后判别响应的状态码,假设是200,则一向调用json()格局将内容分析为JSON重返,否则不回来任何音信。假设现身至极,则捕获并出口其十二分音信。

随后,大家要求定义1个解析方法,用来从结果中领取想要的消息,举个例子此次想保留微博的id、正文、赞数、争持数和转载数那多少个内容,那么能够先遍历cards,然后拿走mblog中的各样音信,赋值为三个新的字典重临就能够:

from pyquery import PyQuery as pq

def parse_page(json):
    if json:
        items = json.get('data').get('cards')
        for item in items:
            item = item.get('mblog')
            weibo = {}
            weibo['id'] = item.get('id')
            weibo['text'] = pq(item.get('text')).text()
            weibo['attitudes'] = item.get('attitudes_count')
            weibo['comments'] = item.get('comments_count')
            weibo['reposts'] = item.get('reposts_count')
            yield weibo

此间大家赖以pyquery将正文中的HTML标签去掉。

末段,遍历一下page,1共十页,将提取到的结果打字与印刷输出就能够:

if __name__ == '__main__':
    for page in range(1, 11):
        json = get_page(page)
        results = parse_page(json)
        for result in results:
            print(result)

其它,大家还足以加一个办法将结果保存到MongoDB数据库:

from pymongo import MongoClient

client = MongoClient()
db = client['weibo']
collection = db['weibo']

def save_to_mongo(result):
    if collection.insert(result):
        print('Saved to Mongo')

诸如此类具备机能就落到实处变成了。运营程序后,样例输出结果如下:

{'id': '4134879836735238', 'text': '惊不惊喜,刺不刺激,意不意外,感不感动', 'attitudes': 3, 'comments': 1, 'reposts': 0}
Saved to Mongo
{'id': '4143853554221385', 'text': '曾经梦想仗剑走天涯,后来过安检给收走了。分享单曲 远走高飞', 'attitudes': 5, 'comments': 1, 'reposts': 0}
Saved to Mongo

翻开一下MongoDB,相应的多寡也被保存到MongoDB,如图所示。

威尼斯人线上娱乐 14

那样,大家就高枕无忧通过分析Ajax并编写爬虫爬取下来了今日头条列表,最后,给出本节的代码地址:。

本节的目的是为着演示Ajax的效仿请求进程,爬取的结果不是器重。该程序仍有繁多足以圆满的地方,如页码的动态总计、新浪查看全文等,若感兴趣,能够品尝一下。

通过那几个实例,大家第贰学会了何等去分析Ajax请求,怎么样用程序来效仿抓取Ajax请求。领悟了抓取原理之后,下一节的Ajax实战演练会越发一箭穿心。

三. 实战练习

此间大家用程序模拟那几个Ajax请求,将本身的前10页博客园全部爬取下来。

先是,定义三个主意来收获每一趟请求的结果。在哀求时,page是3个可变参数,所以大家将它当做艺术的参数字传送递进来,相关代码如下:

from urllib.parse import urlencode
import requests
base_url = 'https://m.weibo.cn/api/container/getIndex?'

headers = {
    'Host': 'm.weibo.cn',
    'Referer': 'https://m.weibo.cn/u/2830678474',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

def get_page(page):
    params = {
        'type': 'uid',
        'value': '2830678474',
        'containerid': '1076032830678474',
        'page': page
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

第三,那里定义了base_url来代表请求的U奥迪Q3L的前半有的。接下来,构造参数字典,个中typevaluecontainerid是固定参数,page是可变参数。接下来,调用urlencode()方法将参数转化为U帕杰罗L的GET请求参数,即类似于type=uid&value=2830678474&containerid=1076032830678474&page=2如此那般的花样。随后,base_url与参数拼合形成三个新的U中华VL。接着,大家用requests请求这么些链接,参加headers参数。然后判定响应的状态码,就算是200,则一向调用json()方法将内容分析为JSON再次回到,不然不回去任何信息。借使出现相当,则捕获并出口其十二分消息。

随后,大家必要定义三个分析方法,用来从结果中提取想要的消息,举例此番想保留网易的id、正文、赞数、争持数和转载数那多少个内容,那么能够先遍历cards,然后拿走mblog中的各种消息,赋值为一个新的字典重临即可:

from pyquery import PyQuery as pq

def parse_page(json):
    if json:
        items = json.get('data').get('cards')
        for item in items:
            item = item.get('mblog')
            weibo = {}
            weibo['id'] = item.get('id')
            weibo['text'] = pq(item.get('text')).text()
            weibo['attitudes'] = item.get('attitudes_count')
            weibo['comments'] = item.get('comments_count')
            weibo['reposts'] = item.get('reposts_count')
            yield weibo

此处大家赖以pyquery将正文中的HTML标签去掉。

终极,遍历一下page,一共十页,将领到到的结果打字与印刷输出就可以:

if __name__ == '__main__':
    for page in range(1, 11):
        json = get_page(page)
        results = parse_page(json)
        for result in results:
            print(result)

其余,大家仍是能够加三个主意将结果保存到MongoDB数据库:

from pymongo import MongoClient

client = MongoClient()
db = client['weibo']
collection = db['weibo']

def save_to_mongo(result):
    if collection.insert(result):
        print('Saved to Mongo')

那般有着机能就落成成功了。运营程序后,样例输出结果如下:

{'id': '4134879836735238', 'text': '惊不惊喜,刺不刺激,意不意外,感不感动', 'attitudes': 3, 'comments': 1, 'reposts': 0}
Saved to Mongo
{'id': '4143853554221385', 'text': '曾经梦想仗剑走天涯,后来过安检给收走了。分享单曲 远走高飞', 'attitudes': 5, 'comments': 1, 'reposts': 0}
Saved to Mongo

翻看一下MongoDB,相应的数额也被封存到MongoDB,如图所示。

威尼斯人线上娱乐 15

这么,我们就顺风经过分析Ajax并编制爬虫爬取下来了新浪列表,最终,给出本节的代码地址:

本节的目的是为了演示Ajax的效仿请求进度,爬取的结果不是器重。该程序仍有多数方可周详的地点,如页码的动态总计、天涯论坛查看全文等,若感兴趣,能够品味一下。

经过这么些实例,大家主要学会了怎么去分析Ajax请求,怎么样用程序来效仿抓取Ajax请求。通晓了抓取原理之后,下1节的Ajax实战演习会越发弹无虚发。

以微博为例,接下去用Python来效仿那些Ajax请求,把本身发过的博客园爬取下来。

  1. 浅析请求 张开Aj…

接口分析

一般HTTP请求提交数据,要求编码成 U哈弗L编码格式,然后做为url的1局地,或许当做参数字传送到Request对象中。

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

发现GET

威尼斯人线上娱乐 16

 

 

威尼斯人线上娱乐 17

威尼斯人线上娱乐 18

用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()

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

威尼斯人线上娱乐 19

 威尼斯人线上娱乐 20

首先我们来看下天猫的接口,看看它的接口相比较一般Ajax多了怎样的始末。

爬取贴吧内容

 先了然贴吧url组成:

威尼斯人线上娱乐 21

各个贴吧url都以以’ kw=‘’贴吧名字‘’,再前边是 &pn=页数
 (pn=0先是页,pn=四肆次之页,依次类推)

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

二.接下来,写叁个百度贴吧爬虫接口tiebaSpider(),要求传递三个参数给这一个接口,
2个是main里组合的url地址,以及早先页码和终止页码,表示要爬取页码的范围。

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

四.将爬取到的每页的新闻囤积在该地球磁性盘上,大家能够归纳写一个囤积文件的接口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)

通过输入想要搜索的贴吧名字,爬取内容并保留到地点

威尼斯人线上娱乐 22

开采天猫页面,寻找2个商品,举例surface,此时张开开拓者工具,截获Ajax请求,大家得以开掘会收获商品列表的接口。

 获取Ajax形式加载的数码

爬虫最急需关爱的不是页面音讯,而是页面消息的多寡来源

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

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

 威尼斯人线上娱乐 23

(二)浏览器访问后,通过抓包工具就足以拿走大家想要的部分音信

 威尼斯人线上娱乐 24

威尼斯人线上娱乐 25

借使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()

 

威尼斯人线上娱乐 26

它的链接包罗了几个GET参数,倘若咱们要想组织Ajax链接直接伸手再好然则了,它的回来内容是Json格式。

威尼斯人线上娱乐 27

不过这些Ajax接口包罗了多少个参数,个中_ksTS、rn参数不能直接开掘其原理,假若我们要去寻觅它的变动规律也不是做不到,但如此相对会相比较繁琐,所以只要大家直接用Selenium来模拟浏览器的话就不须求再关怀那些接口参数了,只要在浏览器里面能够看看的大家都能够爬取。那也是干什么我们选拔Selenium爬取Taobao的来由。

页面分析

咱们本节的对象是爬取商品音信,举个例子:

威尼斯人线上娱乐 28

诸如此类的贰个结实就带有了3个物品的中央音讯,包罗商品图片、名称、价格、购买人数、市肆名称、商场所在地,大家要做的正是将这么些音讯都抓取下来。

抓取入口正是天猫商城的搜索页面,这几个链接是足以一贯协会参数访问的,比如如果搜索GALAXY Tab,就足以一直访问

威尼斯人线上娱乐 29

若是想要分页的话,大家注意到在页面下方有一个分页导航,包含前五页的链接,也席卷下壹页的链接,同时还有3个输入大四页码跳转的链接,如图所示:

威尼斯人线上娱乐 30

在那里商品寻觅结果一般最大都为100页,大家要博取的每1页的剧情,只供给将页码从1到十0梯次遍历就能够,页码数是规定的。所以在此处大家得以一向在页面跳转文本框中输入要跳转的页码,然后点击确定按键跳转就能够到达页码页码对应的页面。

在此间我们不直接点击下一页的原因是,壹旦爬取进度中出现非常退出,比方到了50页退出了,大家要是点击下一页就不可能火速切换成对应的承接页面,而且爬取进度中大家也急需记录当前的页码数,而且只要点击下1页之后页面加载退步,我们还索要做充足检验检验当前页面是加载到了第几页,由此总体流程相对复杂,所以在此地大家1分区直接大选用跳页的艺术来爬取页面。

当大家中标加载出某壹页商品列表时,利用Selenium就能够获得页面源代码,然后大家再用相应的解析库解析就可以,在这里大家选拔PyQuery举行分析。

代码实战

下边我们用代码来落成一下全套抓取进度。

获得商品列表

首先大家供给结构一个抓取的U凯雷德L,

布局出U翼虎L之后大家就必要用Selenium举办抓取了,大家落成如下抓取列表页的艺术:

from selenium import webdriver from selenium.common.exceptions import
TimeoutExceptionfrom selenium.webdriver.common.by import By from
selenium.webdriver.support importexpected_conditions as EC from
selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse
import quote browser = webdriver.Chrome() wait = WebDriverWait(browser,
10) KEYWORD = ‘iPad’defindex_page(page):””” 抓取索引页 :param page:
页码 “”” print( ‘正在爬取第’, page, ‘页’) try: url =
” + quote(KEYWORD) browser.get(url) if
page > 1: input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ‘#mainsrp-pager
div.form > input’))) submit = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ‘#mainsrp-pager
div.form > span.btn.J_Submit’))) input.clear()
input.send_keys(page) submit.click() wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR,
‘#mainsrp-pager li.item.active > span’), str(page)))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
‘.m-itemlist .items .item’))) get_products() except TimeoutException:
index_page(page)

在那边大家率先构造了1个WebDriver对象,使用的浏览器是Chrome,然后钦赐八个首要词,如三星GALAXY Tab,然后大家定义了多个get_index()方法,用于抓取商品列表页。

在该办法里大家率先走访了这么些链接,然后判别了近日的页码,如若超越一,那就张开跳页操作,不然等待页面加载成功。

等候加载大家应用了WebDriverWait对象,它能够钦点等待条件,同时钦命两个最长等待时间,在那里钦点为最长拾秒。就算在那几个时间内成功相配了守候条件,也等于说页面元素成功加载出来了,那就应声赶回相应结果并一连向下实施,不然到了最大等待时间还尚未加载出来就从来抛出超时格外。

举例大家最终要等待商品音讯加载出来,在那里就内定了presence_of_element_located这一个规格,然后传入了
.m-itemlist .items .item
这几个采纳器,而这一个采用器对应的页面内容正是各类商品的消息块,能够到网页里面查看一下。假使加载成功,就会实行后续的get_products()方法,提取商品音信。

关于翻页的操作,大家在此处是首先得到了页码输入框,赋值为input,然后拿走了付出按键,赋值为submit,分别是下图中的多个因素:

威尼斯人线上娱乐 31

首先大家清空了输入框,调用clear()方法就能够,随后调用send_keys()方法将页码填充到输入框中,然后点击鲜明按键就可以。

那正是说怎么着明白有未有跳转到对应的页码呢?我们得以小心到成功跳转某一页后页码都会高亮显示:

威尼斯人线上娱乐 32

大家只须求看清当前高亮的页码数是现阶段的页码数就能够,所以在此间运用了另2个等待条件
text_to_be_present_in_element,它会等待某一文本出现在某三个节点里面即再次来到成功,在那边大家将高亮的页码节点对应的CSS选拔器和当前要跳转的页码通过参数字传送递给那几个等待条件,这样它就会检测当前高亮的页码节点里是否我们传过来的页码数,如果是,那就注解页面成功跳转到了那1页,页面跳转成功。

那么如此,刚才大家所完毕的get_index()方法就可以产生传入对应的页码,然后加载出相应页码的货色列表后,再去调用get_products()方法进行页面解析。

解析商品列表

接下去我们就能够达成get_products()方法来分析商品列表了,在此处我们直接获取页面源代码,然后用PyQuery进行剖析,完成如下:

from pyquery import PyQuery as pq defget_products():””” 提取商品数据
“”” html = browser.page_source doc = pq(html) items = doc(
‘#mainsrp-itemlist .items .item’).items() foritem in items: product = {
‘image’: item.find( ‘.pic .img’).attr( ‘data-src’), ‘price’:
item.find(‘.price’).text(), ‘deal’: item.find( ‘.deal-cnt’).text(),
‘title’: item.find( ‘.title’).text(), ‘shop’: item.find(‘.shop’).text(),
‘location’: item.find( ‘.location’).text() } print(product)
save_to_mongo(product)

率先大家调用了page_source属性获取了页码的源代码,然后构造了PyQuery解析对象,首先大家领到了商品列表,使用的CSS选择器是
#mainsrp-itemlist .items
.item,它会合作到任何页面包车型地铁各类商品,由此它的同盟结果是多个,所以在此处大家又对它进行了二次遍历,用for循环将各种结果个别进行解析,在那边每一个结果大家用for循环把它赋值为item变量,每种item变量都是二个PyQuery对象,然后大家再调用它的find()方法,传入CSS采用器,就能够博得单个商品的一定内容了。

比方说在此处大家查阅一下商品音信源码,如图所示:

威尼斯人线上娱乐 33

在那边我们观看一下货色图片的源码,它是2个 img
节点,包蕴了id、class、data-src、alt、src等品质,在此间大家之所以得以旁观那张图纸是因为它的src属性被赋值为图片的U索罗德L,在那里大家就把它的src属性提抽取来就足以博得商品的图形了,可是那里大家还留意到有一个data-src属性,它的剧情也是图片的U陆风X八L,观看后意识此UPRADOL是图表的1体化大图,而src是收缩后的小图,所以那里大家抓取data-src属性来作为商品的图形。

之所以大家供给先使用find()方法先找到图片的这么些节点,然后再调用attr()方法得到商品的data-src属性即可,这样就大功告成领取了货色图片链接。然后我们用平等的法子提取商品的价格、成交量、名称、市廛、商城所在地等新闻,然后将享有提取结果赋值为贰个字典,叫做product,随后调用save_to_mongo()将其保存到MongoDB就能够。

保存到MongoDB

接下去大家再将商品新闻保存到MongoDB,落成如下:

MONGO_URL = ‘localhost’ MONGO_DB = ‘taobao’ MONGO_COLLECTION =
‘products’client = pymongo.MongoClient(MONGO_URL) db =
client[MONGO_DB]defsave_to_mongo(result):””” 保存至MongoDB :param
result: 结果 “””try: ifdb[MONGO_COLLECTION].insert(result): print(
‘存储到MongoDB成功’) except Exception: print( ‘存储到MongoDB失败’)

我们首先成立了四个MongoDB的连日对象,然后钦命了数据库,在章程里随后钦命了Collection的名称,然后直接调用insert()方法就能够将数据插入到MongoDB,此处的result变量正是在get_products()方法里传出的product,包罗了单个商品的消息,那样大家就打响得以实现了数据的插入。

遍历每页

刚才大家所定义的get_index()方法供给吸收三个参数page,page即代表页码数,所以在此地大家再落到实处页码遍历就能够,代码如下:

MAX_PAGE = 十0defmain():””” 遍历每1页 “””for i in range( 一, MAX_PAGE

  • 1): index_page(i)

实现卓殊简单,只须要调用三个for循环就可以,在那边定义最大的页码数100,range()方法的回来结果就是一到100的列表,顺次遍历调用index_page()方法就可以。

那样我们的天猫商城商品爬虫就完了了,最终调用main()方法就能够运营。

运行

我们将代码运转起来,能够开掘首先会弹出三个Chrome浏览器,然后逐1访问Tmall页面,然后调控台便会输出相应的领到结果,那些商品信息结果都以三个字典方式,然后被储存到了MongoDB里面。

对接PhantomJS

可是此番爬取有个不太对劲儿的地点便是Chrome浏览器,爬取进程必要求翻开二个Chrome浏览器确实不太便宜,所以在此处大家仍是能够对接PhantomJS,只要求将WebDriver的宣示修改一下就可以,可是注意这里不可不要设置好PhantomJS,即便未有安装能够参考第2章里的安装格局求证。

将WebDriver证明修改如下:

browser = webdriver.PhantomJS()

如此在抓取进程中就不会有浏览器弹出了。

其余大家还可以够安装缓存和剥夺图片加载的机能,进一步提升爬取效用,修改如下:

SERVICE_ARGS = [ ‘–load-images=false’, ‘–disk-cache=true’] browser
= webdriver.PhantomJS(service_args=SERVICE_ARGS)

诸如此类大家就可以禁止使用PhantomJS的图纸加载同时开启缓存,能够开采页面爬取速度越来越升高。

源码

本节代码地址为:

天善高校svip包括Excel
BI、Python爬虫案例、Python机器学习、Python数据科学家、大数量、数据分析报告、数据分析师种类、深度学习、猎豹CS6语言案例十套课程火爆报名中,欢迎大家关切
www.hellobi.com/svip

_________________

转发请保留以下内容:

本文来源:天善社区崔庆才先生

原稿链接:https://ask.hellobi.com/blog/cuiqingcai/9185


相关文章

发表评论

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

网站地图xml地图