专栏目录:
Python爬虫与数据分析之python教学视频、python源码分享,python
Python爬虫与数据分析之基础教程:Python的语法、字典、元组、列表
Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器
Python爬虫与数据分析之模块:内置模块、开源模块、自定义模块
Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式
Python爬虫与数据分析之京东爬虫实战:爬取京东商品并存入sqlite3数据库
Python爬虫与数据分析之二手车平台数据获取和分析
Python爬虫与数据分析之python开源爬虫项目汇总
urllib和urllib2
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. 当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
2. 当我们在浏览器输入URL的时候,浏览器发送一个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请求
URL只是标识资源的位置,而HTTP是用来提交和获取资源。客户端发送一个HTTP请求到服务器的请求消息,包括以下格式:
请求行
、请求头部
、空行
、请求数据
一个典型的HTTP请求
1 GET / HTTP/1.12 Host: 3 Connection: keep-alive4 Upgrade-Insecure-Requests: 15 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.366 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.87 Accept-Encoding: gzip, deflate, br8 Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.49 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
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服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如:/s?wd=Chinese
POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码.
HTTP响应状态码
浏览器内核
浏览器 内核
IE Trident
Chrome Webkit
Firefox Gecho
Opera Pesto
Safari(Apple) Webkit
HTTP代理工具Fiddler
Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP请求.
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 树来显示它。
Responser部分详解
Transformer —— 显示响应的编码信息。Headers —— 用分级视图显示响应的 header。TextView —— 使用文本显示相应的 body。ImageVies —— 如果请求是图片资源,显示响应的图片。HexView —— 用十六进制数据显示响应。WebView —— 响应在 Web 浏览器中的预览效果。Auth —— 显示响应 header 中的 Proxy-Authorization(代理身份验证) 和 Authorization(授权) 信息。Caching —— 显示此请求的缓存信息。Privacy —— 显示此请求的私密 (P3P) 信息。Raw —— 将整个响应显示为纯文本。JSON - 显示JSON格式文件。XML —— 如果响应的 body 是 XML 格式,就是用分级的 XML 树来显示它 。
了解了这些知识后,接下来真正迈向爬虫之路.......
urllib2
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,先学习urllib2
。
urllib2模块直接导入就可以用,在python3中urllib2被改为urllib.request
开始爬虫需要准备的一些工具
(1)下载Fiddeler抓包工具,百度直接下载安装就可以(抓包)
(2)下载chrome浏览器代理插件Proxy-SwitchyOmega(代理)
(3)下载chrome浏览器插件XPath(解析HTML)
(4)工具网站:/ (json解析网站)
/tools/urlencode.aspx (url编码解码网站)
先写个简单的爬虫百度页面
urlopen
1 # _*_ coding:utf-8 _*_2 import urllib23 4 #向指定的url地址发送请求,并返回服务器响应的类文件对象5 response = urllib2.urlopen(/)6 #服务器返回的类文件对象支持python文件对象的操作方法7 #read()方法就是读取文件里的全部内容,返回字符串8 html = response.read()9 print html
urllib2默认的User-Agent是Python-urllib/2.7,容易被检查到是爬虫,所以我们要构造一个请求对象,要用到request方法。
模拟浏览器访问
浏览器访问时通过抓包工具获得的headers信息如下:
1 GET / HTTP/1.12 Host: 3 Connection: keep-alive4 Cache-Control: max-age=05 Upgrade-Insecure-Requests: 16 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.367 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.88 Accept-Encoding: gzip, deflate, br9 Accept-Language: zh,zh-CN;q=0.8,ar;q=0.6,zh-TW;q=0.410 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=1231435311
我们要设置User-Agent模仿浏览器去访问数据
1 # _*_ coding:utf-8 _*_2 import urllib23 4 # User-Agent是爬虫与反爬虫的第一步5 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}6 # 通过urllib2.Request()方法构造一个请求对象7 request = urllib2.Request(/,headers=ua_headers)8 9 #向指定的url地址发送请求,并返回服务器响应的类文件对象10 response = urllib2.urlopen(request)11 12 # 服务器返回的类文件对象支持python文件对象的操作方法13 # read()方法就是读取文件里的全部内容,返回字符串14 html = response.read()15 16 print html17
Request总共三个参数,除了必须要有url参数,还有下面两个:
1. data(默认空):是伴随 url 提交的数据(比如要post的数据),同时 HTTP 请求将从 "GET"方式 改为 "POST"方式。
2. headers(默认空):是一个字典,包含了需要发送的HTTP报头的键值对。
response的常用方法
1 # _*_ coding:utf-8 _*_2 import urllib23 4 # User-Agent是爬虫与反爬虫的第一步5 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}6 # 通过urllib2.Request()方法构造一个请求对象7 request = urllib2.Request(/,headers=ua_headers)8 9 #向指定的url地址发送请求,并返回服务器响应的类文件对象10 response = urllib2.urlopen(request)11 12 # 服务器返回的类文件对象支持python文件对象的操作方法13 # read()方法就是读取文件里的全部内容,返回字符串14 html = response.read()15 16 # 返回HTTP的响应吗,成功返回200,4服务器页面出错,5服务器问题17 print response.getcode()#20018 19 # 返回数据的实际url,防止重定向20 print response.geturl()#/21 22 # 返回服务器响应的HTTP报头23 print response.info()24 25 # prin