python 爬虫基础知识(继续补充)

学了这么久爬虫,今天整理一下相关知识点,还会继续更新html

HTTP和HTTPS

HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。git

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

SSL(Secure Sockets Layer 安全套接层)主要用于Web的安全传输协议,在传输层对网络链接进行加密,保障在Internet上数据传输的安全。json

  • HTTP的端口号为80
  • HTTPS的端口号为443

HTTP工做原理

网络爬虫抓取过程能够理解为模拟浏览器操做的过程api

浏览器的主要功能是向服务器发出请求,在浏览器窗口中展现您选择的网络资源,HTTP是一套计算机经过网络进行通讯的规则。浏览器

 

HTTP请求主要分为GetPost两种方法

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

  • GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese服务器

  • POST请求参数在请求体当中,消息长度没有限制并且以隐式的方式进行发送,一般用来向HTTP服务器提交量比较大的数据(好比请求中包含许多参数或者文件上传操做等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码,cookie

注意:避免使用Get方式提交表单,由于有可能会致使安全问题。 好比说在登录表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。网络

 

经常使用的请求报头:

1. Host (主机和端口号)

Host:对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,一般属于URL的一部分。

2. Connection (连接类型)

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

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

  2. Server收到请求后:

    • 若是 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭链接;
    • 若是 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭链接。
  3. 若是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 的一种变长字符编码,能够解决多种语言文本显示问题,从而实现应用国际化和本地化。

若是在请求消息中没有设置这个域,缺省是任何字符集均可以接受。

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它能够记载和服务器相关的用户信息,也能够用来实现会话功能,之后会详细讲。

11. Content-Type (POST数据类型)

Content-Type:POST请求里用来表示的内容类型。

举例:Content-Type = Text/XML; charset=gb2312:

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

 

Cookie 和 Session:

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

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

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

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

 

 

requests:

r = requests.get('http://www.baidu.com')

r.status_code #响应状态码,为方便引用

r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取

r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,可是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常

 

get请求:

params的时候之间接把参数加到url后面,只在get请求时使用
 1 import requests
 2 
 3 
 4 #get 请求 header 和 params
 5 base_url = 'http://www.baidu.com/s'
 6 
 7 headers = {
 8     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
 9 }
10 response = requests.get(base_url,headers=headers,params={'wd':'ip','pn':'0'})
11 
12 print(response.status_code)
13 print(response.url)

 

post请求:

data用于post请求时

1 # post 请求
2 login_url = 'http://www.renren.com/PLogin.do'
3 data = {
4     'email' : '1111@qq.com',
5     'password' : '1234qwer'
6 }
7 response = requests.post(login_url,data=data,headers={},params={})
8 print(response.url)

 

复杂的post请求:

传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

'''

"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"

'''

 

你还能够为 data 参数传入一个元组列表。在表单中多个元素使用同一 key 的时候

payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)
print(r.text)

{
 ...  "form": {  "key1": [  "value1",  "value2"  ]  },  ... }

 

Github API v3 接受编码为 JSON 的 POST/PATCH 数据:

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))

还能够直接传递

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)

 

响应码:

r = requests.get('http://httpbin.org/get')
r.status_code

>>>200

Requests还附带了一个内置的状态码查询对象:

r.status_code == requests.codes.ok

若是发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),咱们能够经过 Response.raise_for_status() 来抛出异常:

bad_r = requests.get('http://httpbin.org/status/404')
bad_r.status_code
相关文章
相关标签/搜索