太原建站模板系统,广州网站建设网站制作,个人做网站被骗,浑南区建设局网站通用爬虫和聚焦爬虫 根据使用场景#xff0c;网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统#xff08;Baidu、Google、Yahoo等#xff09;的重要组成部分。主要目的是将互联网上的网页下载到本地#xff0c;形成一个互联网内容的… 通用爬虫和聚焦爬虫 根据使用场景网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统Baidu、Google、Yahoo等的重要组成部分。主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份。 通用搜索引擎Search Engine工作原理 通用网络爬虫 从互联网中搜集网页采集信息这些网页信息用于为搜索引擎建立索引从而提供支持它决定着整个引擎系统的内容是否丰富信息是否即时因此其性能的优劣直接影响着搜索引擎的效果。 第一步抓取网页 搜索引擎网络爬虫的基本工作流程如下 首先选取一部分的种子URL将这些URL放入待抓取URL队列 取出待抓取URL解析DNS得到主机的IP并将URL对应的网页下载下来存储进已下载网页库中并且将这些URL放进已抓取URL队列。 分析已抓取URL队列中的URL分析其中的其他URL并且将URL放入待抓取URL队列从而进入下一个循环.... 搜索引擎如何获取一个新网站的URL 1. 新网站向搜索引擎主动提交网址如百度http://zhanzhang.baidu.com/linksubmit/url 2. 在其他网站上设置新网站外链尽可能处于搜索引擎爬虫爬取范围 3. 搜索引擎和DNS解析服务商(如DNSPod等合作新网站域名将被迅速抓取。 但是搜索引擎蜘蛛的爬行是被输入了一定的规则的它需要遵从一些命令或文件的内容如标注为nofollow的链接或者是Robots协议。 Robots协议也叫爬虫协议、机器人协议等全称是“网络爬虫排除标准”Robots Exclusion Protocol网站通过Robots协议告诉搜索引擎哪些页面可以抓取哪些页面不能抓取例如 淘宝网https://www.taobao.com/robots.txt 腾讯网 http://www.qq.com/robots.txt 第二步数据存储 搜索引擎通过爬虫爬取到的网页将数据存入原始页面数据库。其中的页面数据与用户浏览器得到的HTML是完全一样的。 搜索引擎蜘蛛在抓取页面时也做一定的重复内容检测一旦遇到访问权重很低的网站上有大量抄袭、采集或者复制的内容很可能就不再爬行。 第三步预处理 搜索引擎将爬虫抓取回来的页面进行各种步骤的预处理。 提取文字中文分词消除噪音比如版权声明文字、导航条、广告等……索引处理链接关系计算特殊文件处理....除了HTML文件外搜索引擎通常还能抓取和索引以文字为基础的多种文件类型如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我们在搜索结果中也经常会看到这些文件类型。 但搜索引擎还不能处理图片、视频、Flash 这类非文字内容也不能执行脚本和程序。 第四步提供检索服务网站排名 搜索引擎在对信息进行组织和处理后为用户提供关键字检索服务将用户检索相关的信息展示给用户。 同时会根据页面的PageRank值链接的访问量排名来进行网站排名这样Rank值高的网站在搜索结果中会排名较前当然也可以直接使用 Money 购买搜索引擎网站排名简单粗暴。 但是这些通用性搜索引擎也存在着一定的局限性 通用搜索引擎所返回的结果都是网页而大多情况下网页里90%的内容对用户来说都是无用的。 不同领域、不同背景的用户往往具有不同的检索目的和需求搜索引擎无法提供针对具体某个用户的搜索结果。 万维网数据形式的丰富和网络技术的不断发展图片、数据库、音频、视频多媒体等不同数据大量出现通用搜索引擎对这些文件无能为力不能很好地发现和获取。 通用搜索引擎大多提供基于关键字的检索难以支持根据语义信息提出的查询无法准确理解用户的具体需求。 针对这些情况聚焦爬虫技术得以广泛使用。 聚焦爬虫 聚焦爬虫是面向特定主题需求的一种网络爬虫程序它与通用搜索引擎爬虫的区别在于 聚焦爬虫在实施网页抓取时会对内容进行处理筛选尽量保证只抓取与需求相关的网页信息。 而我们今后要学习的就是聚焦爬虫。 HTTP和HTTPS HTTP协议HyperText Transfer Protocol超文本传输协议是一种发布和接收 HTML页面的方法。 HTTPSHypertext Transfer Protocol over Secure Socket Layer简单讲是HTTP的安全版在HTTP下加入SSL层。 SSLSecure Sockets Layer 安全套接层主要用于Web的安全传输协议在传输层对网络连接进行加密保障在Internet上数据传输的安全。 HTTP的端口号为80HTTPS的端口号为443HTTP工作原理 网络爬虫抓取过程可以理解为模拟浏览器操作的过程。 浏览器的主要功能是向服务器发出请求在浏览器窗口中展示您选择的网络资源HTTP是一套计算机通过网络进行通信的规则。 HTTP的请求与响应 HTTP通信由两部分组成 客户端请求消息 与 服务器响应消息 浏览器发送HTTP请求的过程 当用户在浏览器的地址栏中输入一个URL并按回车键之后浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。 当我们在浏览器输入URL http://www.baidu.com 的时候浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件服务器把Response文件对象发送回给浏览器。 浏览器分析Response中的 HTML发现其中引用了很多其他文件比如Images文件CSS文件JS文件。 浏览器会自动再次发送Request去获取图片CSS文件或者JS文件。 当所有的文件都下载成功后网页会根据HTML语法结构完整的显示出来了。 URLUniform / Universal Resource Locator的缩写统一资源定位符是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。 基本格式scheme://host[:port#]/path/…/[?query-string][#anchor] scheme协议(例如http, https, ftp)host服务器的IP地址或者域名port#服务器的端口如果是走协议默认端口缺省端口80path访问资源的路径query-string参数发送给http服务器的数据anchor锚跳转到网页的指定锚点位置例如 ftp://192.168.0.116:8080/index http://www.baidu.com http://item.jd.com/11936238.html#product-detail 客户端HTTP请求 URL只是标识资源的位置而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 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8 Referer: http://www.baidu.com/ Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q0.8,en;q0.6 Cookie: BAIDUID04E4001F34EA74AD4601512DD3C41A7B:FG1; BIDUPSID04E4001F34EA74AD4601512DD3C41A7B; PSTM1470329258; MCITY-343%3A340%3A; BDUSSnF0MVFiMTVLcUh-Q2MxQ0M3STZGQUZ4N2hBa1FFRkIzUDI3QlBCZjg5cFdOd1pZQVFBQUFBJCQAAAAAAAAAAAEAAADpLvgG0KGyvLrcyfrG-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFaq3ldWqt5XN; H_PS_PSSID1447_18240_21105_21386_21454_21409_21554; BD_UPN12314753; sug3; sugstore0; ORIGIN0; bdime0; H_PS_645EC7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM0 请求方法 GET https://www.baidu.com/ HTTP/1.1 根据HTTP标准HTTP请求可以使用多种请求方法。 HTTP 0.9只有基本的文本 GET 功能。 HTTP 1.0完善的请求/响应模型并将协议补充完整定义了三种请求方法 GET, POST 和 HEAD方法。 HTTP 1.1在 1.0 基础上进行更新新增了五种请求方法OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 HTTP 2.0未普及请求/响应首部的定义基本没有改变只是所有首部键必须全部小写而且请求行要独立为 :method、:scheme、:host、:path这些键值对。 序号方法描述1GET请求指定的页面信息并返回实体主体。2HEAD类似于get请求只不过返回的响应中没有具体的内容用于获取报头3POST向指定资源提交数据进行处理请求例如提交表单或者上传文件数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。4PUT从客户端向服务器传送的数据取代指定的文档的内容。5DELETE请求服务器删除指定的页面。6CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。7OPTIONS允许客户端查看服务器的性能。8TRACE回显服务器收到的请求主要用于测试或诊断。HTTP请求主要分为Get和Post两种方法 GET是从服务器上获取数据POST是向服务器传送数据 GET请求参数显示都显示在浏览器网址上HTTP服务器根据该请求所包含URL中的参数来产生响应内容即“Get”请求的参数是URL的一部分。 例如 http://www.baidu.com/s?wdChinese POST请求参数在请求体当中消息长度没有限制而且以隐式的方式进行发送通常用来向HTTP服务器提交量比较大的数据比如请求中包含许多参数或者文件上传操作等请求的参数包含在“Content-Type”消息头里指明该消息体的媒体类型和编码 注意避免使用Get方式提交表单因为有可能会导致安全问题。 比如说在登陆表单中用Get方式用户输入的用户名和密码将在地址栏中暴露无遗。 常用的请求报头 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指浏览器或其他客户端可以接受的MIMEMultipurpose Internet Mail Extensions多用途互联网邮件扩展文件类型服务器可以根据它判断并返回适当的文件格式。 举例 Accept: */*表示什么都可以接收。 Acceptimage/gif表明客户端希望接受GIF图像格式的资源 Accepttext/html表明客户端希望接受html文本。 Accept: text/html, application/xhtmlxml;q0.9, image/*;q0.8表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。 q是权重系数范围 0 q 1q 值越大请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值则默认为1按从左到右排序顺序若被赋值为0则用于表示浏览器不接受此内容类型。 Text用于标准化地表示的文本信息文本消息可以是多种字符集和或者多种格式的Application用于传输应用程序数据或者二进制数据。详细请点击 6. Referer (页面跳转处) Referer表明产生请求的网页来自于哪个URL用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面是从什么网站来的等。 有时候遇到下载某网站图片需要对应的referer否则无法下载图片那是因为人家做了防盗链原理就是根据referer去判断是否是本网站的地址如果不是则拒绝如果是就可以下载 7. Accept-Encoding文件编解码格式 Accept-Encoding指出浏览器可以接受的编码方式。编码方式不同于文件格式它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码然后再检查文件格式许多情形下这可以减少大量的下载时间。 举例Accept-Encoding:gzip;q1.0, identity; q0.5, *;q0 如果有多个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-8UNICODE 的一种变长字符编码可以解决多种语言文本显示问题从而实现应用国际化和本地化。如果在请求消息中没有设置这个域缺省是任何字符集都可以接受。 10. Cookie Cookie Cookie浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体它可以记载和服务器相关的用户信息也可以用来实现会话功能以后会详细讲。 11. Content-Type (POST数据类型) Content-TypePOST请求里用来表示的内容类型。 举例Content-Type Text/XML; charsetgb2312 指明该请求的消息体中包含的是纯文本的XML类型的数据字符编码采用“gb2312”。 服务端HTTP响应 HTTP响应也由四个部分组成分别是 状态行、消息报头、空行、响应正文 HTTP/1.1 200 OK
Server: Tengine
Connection: keep-alive
Date: Wed, 30 Nov 2016 07:58:21 GMT
Cache-Control: no-cache
Content-Type: text/html;charsetUTF-8
Keep-Alive: timeout20
Vary: Accept-Encoding
Pragma: no-cache
X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395
Content-Length: 180945!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN ....常用的响应报头(了解) 理论上所有的响应头信息都应该是回应请求头的。但是服务端为了效率安全还有其他方面的考虑会添加相对应的响应头信息从上图可以看到 1. Cache-Controlmust-revalidate, no-cache, private。 这个值告诉客户端服务端不希望客户端缓存资源在下次请求资源时必须要从新请求服务器不能从缓存副本中获取资源。 Cache-Control是响应头中很重要的信息当客户端请求头中包含Cache-Control:max-age0请求明确表示不会缓存服务器资源时,Cache-Control作为作为回应信息通常会返回no-cache意思就是说那就不缓存呗。 当客户端在请求头中没有包含Cache-Control时服务端往往会定,不同的资源不同的缓存策略比如说oschina在缓存图片资源的策略就是Cache-Controlmax-age86400,这个意思是从当前时间开始在86400秒的时间内客户端可以直接从缓存副本中读取资源而不需要向服务器请求。 2. Connectionkeep-alive 这个字段作为回应客户端的Connectionkeep-alive告诉客户端服务器的tcp连接也是一个长连接客户端可以继续使用这个tcp连接发送http请求。 3. Content-Encoding:gzip 告诉客户端服务端发送的资源是采用gzip编码的客户端看到这个信息后应该采用gzip对资源进行解码。 4. Content-Typetext/html;charsetUTF-8 告诉客户端资源文件的类型还有字符编码客户端通过utf-8对资源进行解码然后对资源进行html解析。通常我们会看到有些网站是乱码的往往就是服务器端没有返回正确的编码。 5. DateSun, 21 Sep 2016 06:18:21 GMT 这个是服务端发送资源时的服务器时间GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的这主要是解决在互联网上不同时区在相互请求资源的时候时间混乱问题。 6. Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的告诉客户端在这个时间前可以直接访问缓存副本很显然这个值会存在问题因为客户端和服务器的时间不一定会都是相同的如果时间不同就会导致问题。所以这个响应头是没有Cache-Controlmax-age*这个响应头准确的因为max-agedate中的date是个相对时间不仅更好理解也更准确。 7. Pragma:no-cache 这个含义与Cache-Control等同。 8.ServerTengine/1.4.6 这个是服务器和相对应的版本只是告诉客户端服务器的信息。 9. Transfer-Encodingchunked 这个响应头告诉客户端服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的在发送时还不知道发送资源的大小所以采用分块发送每一块都是独立的独立的块都能标示自己的长度最后一块是0长度的当客户端读到这个0长度的块时就可以确定资源已经传输完了。 10. Vary: Accept-Encoding 告诉缓存服务器缓存压缩文件和非压缩文件两个版本现在这个字段用处并不大因为现在的浏览器都是支持压缩的。 响应状态码 响应状态代码有三位数字组成第一个数字定义了响应的类别且有五种可能取值。 常见状态码 100~199表示服务器成功接收部分请求要求客户端继续提交其余请求才能完成整个处理过程。 200~299表示服务器成功接收请求并已完成整个处理过程。常用200OK 请求成功。 300~399为完成请求客户需进一步细化请求。例如请求的资源已经移动一个新地址、常用302所请求的页面已经临时转移至新的url、307和304使用缓存资源。400~499客户端的请求有错误常用404服务器无法找到被请求的页面、403服务器拒绝访问权限不够。500~599服务器端出现错误常用500请求未完成。服务器遇到不可预知的情况。Cookie 和 Session 服务器和客户端的交互仅限于请求/响应过程结束之后便断开在下一次请求时服务器会认为新的客户端。 为了维护他们之间的链接让服务器知道这是前一个用户发送的请求必须在一个地方保存客户端的信息。 Cookie通过在 客户端 记录的信息确定用户的身份。 Session通过在 服务器端 记录的信息确定用户的身份。 Fiddler界面 设置好后本机HTTP通信都会经过127.0.0.1:8888代理也就会被Fiddler拦截到。 请求 (Request) 部分详解 Headers —— 显示客户端发送到服务器的 HTTP 请求的 header显示为一个分级视图包含了 Web 客户端信息、Cookie、传输状态等。Textview —— 显示 POST 请求的 body 部分为文本。WebForms —— 显示请求的 GET 参数 和 POST body 内容。HexView —— 用十六进制数据显示请求。Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息.Raw —— 将整个请求显示为纯文本。JSON - 显示JSON格式文件。XML —— 如果请求的 body 是 XML 格式就是用分级的 XML 树来显示它。 响应 (Response) 部分详解 Transformer —— 显示响应的编码信息。Headers —— 用分级视图显示响应的 header。TextView —— 使用文本显示相应的 body。ImageVies —— 如果请求是图片资源显示响应的图片。HexView —— 用十六进制数据显示响应。WebView —— 响应在 Web 浏览器中的预览效果。Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息。Caching —— 显示此请求的缓存信息。Privacy —— 显示此请求的私密 (P3P) 信息。Raw —— 将整个响应显示为纯文本。JSON - 显示JSON格式文件。XML —— 如果响应的 body 是 XML 格式就是用分级的 XML 树来显示它 。 HTTP/HTTPS的GET和POST方法 urllib.parse.urlencode() # IPython 中的测试结果
In [1]: import urllib.parseIn [2]: word {wd : 传智播客} # 通过urllib.parse.urlencode()方法将字典键值对按URL编码转换从而能被web服务器接受。 In [3]: urllib..parse.urlencode(word) Out[3]: wd%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2 # 通过urllib.parse.unquote()方法把 URL编码字符串转换回原先字符串。 In [4]: print (urllib.parse.unquote(wd%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2)) wd传智播客 一般HTTP请求提交数据需要编码成 URL编码格式然后做为url的一部分或者作为参数传到Request对象中。 Get方式 GET请求一般用于我们向服务器获取数据比如说我们用百度搜索传智播客https://www.baidu.com/s?wd传智播客 浏览器的url会跳转成如图所示: https://www.baidu.com/s?wd%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2 在其中我们可以看到在请求部分里http://www.baidu.com/s? 之后出现一个长长的字符串其中就包含我们要查询的关键词传智播客于是我们可以尝试用默认的Get方式来发送请求。 # urllib_get.pyimport urllib.parse #负责url编码处理
import urllib.requesturl http://www.baidu.com/s word {wd:传智播客} word urllib.parse.urlencode(word) #转换成url编码格式字符串 newurl url ? word # url首个分隔符就是 ? headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36 } request urllib.request.Request(newurl, headersheaders) response urllib.request.urlopen(request) print (response.read()) 批量爬取贴吧页面数据 首先我们创建一个python文件, tiebaSpider.py我们要完成的是输入一个百度贴吧的地址比如 百度贴吧LOL吧第一页http://tieba.baidu.com/f?kwlolieutf-8pn0 第二页 http://tieba.baidu.com/f?kwlolieutf-8pn50 第三页 http://tieba.baidu.com/f?kwlolieutf-8pn100 发现规律了吧贴吧中每个页面不同之处就是url最后的pn的值其余的都是一样的我们可以抓住这个规律。 #!/usr/bin/env python
# -*- coding:utf-8 -*-import urllib.request
import urllib.parsedef loadPage(url, filename):作用根据url发送请求获取服务器响应文件url: 需要爬取的url地址filename : 处理的文件名print (正在下载 filename)headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36}request urllib.request.Request(url, headers headers)return urllib.request.urlopen(request).read()def writePage(html, filename):作用将html内容写入到本地html服务器相应文件内容print (正在保存 filename)# 文件写入with open(filename, wb) as f:f.write(html)print (- * 30)def tiebaSpider(url, beginPage, endPage):作用贴吧爬虫调度器负责组合处理每个页面的urlurl : 贴吧url的前部分beginPage : 起始页endPage : 结束页for page in range(beginPage, endPage 1):pn (page - 1) * 50filename 第 str(page) 页.htmlfullurl url pn str(pn)#print fullurlhtml loadPage(fullurl, filename)#print htmlwritePage(html, filename)print (谢谢使用)if __name__ __main__:kw input(请输入需要爬取的贴吧名:)beginPage int(input(请输入起始页))endPage int(input(请输入结束页))url http://tieba.baidu.com/f?key urllib.parse.urlencode({kw: kw})fullurl url keytiebaSpider(fullurl, beginPage, endPage) View Code 其实很多网站都是这样的同类网站下的html页面编号分别对应网址后的网页序号只要发现规律就可以批量爬取页面了。 POST方式 上面我们说了Request请求对象的里有data参数它就是用在POST里的我们要传送的数据就是这个参数datadata是一个字典里面要匹配键值对。 有道词典翻译网站 输入测试数据再通过使用Fiddler观察其中有一条是POST请求而向服务器发送的请求数据并不是在url里那么我们可以试着模拟这个POST请求。 于是我们可以尝试用POST方式发送请求。 #!/usr/bin/env python
# -*- coding:utf-8 -*-import urllib.request
import urllib.parse# 通过抓包的方式获取的url并不是浏览器上显示的url
url http://fanyi.youdao.com/translate?smartresultdictsmartresultrulesmartresultugcsessionFromnull# 完整的headers
headers {Accept : application/json, text/javascript, */*; q0.01,X-Requested-With : XMLHttpRequest,User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36,Content-Type : application/x-www-form-urlencoded; charsetUTF-8,}# 用户接口输入# 发送到web服务器的表单数据
formdata {
type : AUTO,
i : 我爱你,
doctype : json,
xmlVersion : 1.6,
keyfrom : fanyi.web,
ue : UTF-8,
typoResult : true
}# 经过urlencode转码
data urllib.parse.urlencode(formdata).encode(utf-8)# 如果Request()方法里的data参数有值那么这个请求就是POST
# 如果没有就是Get
#request urllib.request.Request(url, data data, headers headers)
response urllib.request.urlopen(url,data)html response.read().decode(utf-8)print(html)
#print (urllib.request.urlopen(req).read()) View Code 发送POST请求时需要特别注意headers的一些属性 Content-Length: 144 是指发送的表单数据长度为144也就是字符个数是144个。 X-Requested-With: XMLHttpRequest 表示Ajax异步请求。 Content-Type: application/x-www-form-urlencoded 表示浏览器提交 Web 表单时使用表单数据会按照 name1value1name2value2 键值对形式进行编码。 获取AJAX加载的内容 有些网页内容使用AJAX加载只要记得AJAX一般返回的是JSON,直接对AJAX地址进行post或get就返回JSON数据了。 作为一名爬虫工程师你最需要关注的是数据的来源 import urllib
import urllib2# demo1url https://movie.douban.com/j/chart/top_list?type11interval_id100%3A90actionheaders{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() 问题为什么有时候POST也能在URL内看到数据 GET方式是直接以链接形式访问链接中包含了所有的参数服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择不过你可以直观地看到自己提交了什么内容。 POST则不会在网址上显示所有的参数服务器端用Request.Form获取提交的数据在Form提交的时候。但是HTML代码里如果不指定 method 属性则默认为GET请求Form中提交的数据将会附加在url之后以?分开与url分开。 表单数据可以作为 URL 字段methodget或者 HTTP POST methodpost的方式来发送。比如在下面的HTML代码中表单数据将因为 methodget 而附加到 URL 上 form actionform_action.asp methodget pFirst name: input typetext namefname //p pLast name: input typetext namelname //p input typesubmit valueSubmit / /form 利用cookie模拟登陆 #!/usr/bin/env python
# -*- coding:utf-8 -*-import urllib.requesturl http://www.renren.com/410043129/profileheaders {Host : www.renren.com,Connection : keep-alive,#Upgrade-Insecure-Requests : 1,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,Accept : text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8,Referer : http://www.renren.com/SysHome.do,#Accept-Encoding : gzip, deflate, sdch,#加上会得到压缩文件Cookie : anonymidixrna3fysufnwv; _r01_1; depovinceGW; jebe_keyf6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484400895379; jebe_keyf6fb270b-d06d-42e6-8b53-e67c3156aa7e%7Cc13c37f53bca9e1e7132d4b58ce00fa3%7C1484060607478%7C1%7C1484400890914; JSESSIONIDabcX8s_OqSGsYeRg5vHMv; jebecookies0c5f9b0d-03d8-4e6a-b7a9-3845d04a9870|||||; ick_login8a429d6c-78b4-4e79-8fd5-33323cd9e2bc; _deBF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; p0cedb18d0982741d12ffc9a0d93670e09; ap327550029; first_login_flag1; ln_uactmr_mao_hacker163.com; ln_hurlhttp://hdn.xnimg.cn/photos/hdn521/20140529/1055/h_main_9A3Z_e0c300019f6a195a.jpg; t56c0c522b5b068fdee708aeb1056ee819; societyguester56c0c522b5b068fdee708aeb1056ee819; id327550029; xnsid5ea75bd6; loginfromsyshome,Accept-Language : zh-CN,zh;q0.8,en;q0.6,
}request urllib.request.Request(url, headers headers)response urllib.request.urlopen(request)print(response.read()) View Code 处理HTTPS请求 SSL证书验证 现在随处可见 https 开头的网站urllib2可以为 HTTPS 请求验证SSL证书就像web浏览器一样如果网站的SSL证书是经过CA认证的则能够正常访问如https://www.baidu.com/等... 如果SSL证书验证不通过或者操作系统不信任服务器的安全证书比如浏览器在访问12306网站如https://www.12306.cn/mormhweb/的时候会警告用户证书不受信任。据说 12306 网站证书是自己做的没有通过CA认证 #!/usr/bin/env python
# -*- coding:utf-8 -*-import urllib.request
import ssl# 忽略SSL安全认证
context ssl._create_unverified_context()url https://www.12306.cn/mormhweb/
#url https://www.baidu.com/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 urllib.request.Request(url, headers headers)# 添加到context参数里
response urllib.request.urlopen(request, context context)print (response.read()) View Code 关于CA CA(Certificate Authority)是数字证书认证中心的简称是指发放、管理、废除数字证书的受信任的第三方机构如北京数字认证股份有限公司、上海市数字证书认证中心有限公司等... CA的作用是检查证书持有者身份的合法性并签发证书以防证书被伪造或篡改以及对证书和密钥进行管理。 现实生活中可以用身份证来证明身份 那么在网络世界里数字证书就是身份证。和现实生活不同的是并不是每个上网的用户都有数字证书的往往只有当一个人需要证明自己的身份的时候才需要用到数字证书。 普通用户一般是不需要因为网站并不关心是谁访问了网站现在的网站只关心流量。但是反过来网站就需要证明自己的身份了。 比如说现在钓鱼网站很多的比如你想访问的是www.baidu.com但其实你访问的是www.daibu.com”所以在提交自己的隐私信息之前需要验证一下网站的身份要求网站出示数字证书。 一般正常的网站都会主动出示自己的数字证书来确保客户端和网站服务器之间的通信数据是加密安全的。 转载于:https://www.cnblogs.com/luchun666/p/9394149.html