python爬虫(一)

get与post

印象中get是请求数据,post是提交数据,然后博主在网上查了这个问题,一些比较深入的原理性的解释并没有看懂,所以下面放的是w3school给的二者之间的差别,日后真正需要理解原理再看原理

1.get
/test/demo_form.asp?name1=value1&name2=value2
//get请求的参数可以直接在网址中看到
2.post
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
//查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的

GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。

使用urlopen实现简单的get请求
from urllib import request
url = 'http://www.baidu.com'
response = request.urlopen(url)
print(type(response))
// <class 'http.client.HTTPResponse'>
print(response.status)
// 200
print(response.getheaders())
// [('Bdpagetype', '1'), ('Bdqid', '0xe33e78e7008aa464'), ('Cache-Control', 'private'), ('Content-Type', 'text/html'), ('Cxy_all', 'baidu+e9796a138c6d3b396ecc3acff17c10fa'), ('Date', 'Wed, 07 Aug 2019 01:34:03 GMT'), ('Expires', 'Wed, 07 Aug 2019 01:33:12 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BAIDUID=917778D9E1FD56AA30FC9D358F772C52:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BIDUPSID=917778D9E1FD56AA30FC9D358F772C52; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1565141643; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'delPer=0; path=/; domain=.baidu.com'), ('Set-Cookie', 'BDSVRTM=0; path=/'), ('Set-Cookie', 'BD_HOME=0; path=/'), ('Set-Cookie', 'H_PS_PSSID=1439_21114_29522_29519_29099_29567_28835_29221_26350_22160; path=/; domain=.baidu.com'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
print(response.read().decode('utf-8'))
// 返回网页源代码
断开网络再运行会发生错误,常见的状态码

常见的状态码:

  • 200:请求正常,服务器正常的返回数据。
  • 301:永久重定向。
  • 302:临时重定向。比如在访问一个需要登录的 页面的时候,而此时没有登录,那么就会 重定向到登录页面。
  • 400:请求的url在服务器上找不到。换句话说就是请求url错误。
  • 403:服务器拒绝访问,权限不够。
  • 404:请求失败,请求所希望的资源未被在服务器上发现。
请求头,如何添加请求头

在http协议中,向服务器发送一个请求,数据分为三部分,第一个是把数据放在url中,第二个是把数据放在body中(在post请求中),第三个就是把数据放在head中。下面是一些请求头参数,经常会用到的是:Referer、Cookie、User-Agent

Accept:浏览器可接受的MIME类型。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Charset:浏览器可接受的字符集。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。
Content-Length:表示请求消息正文的长度。
Referer:表明当前这个请求是从哪个url过来的。这个一般也可以用来做反爬虫技术。如果不是从指定页面过来的,那么就不做相关的响应。
Cookie:http协议是无状态的。也就是同一个人发送了两次请求,服务器没有能力知道这两个请求是否来自同一个人。因此这时候就用cookie来做标识。一般如果想要做登录后才能访问的网站,那么就需要发送cookie信息了。
User-Agent:浏览器名称。这个在网络爬虫中经常会被使用到。请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由哪种浏览器发送的。如果我们是通过爬虫发送请求,那么我们的****User-Agent就是Python,这对于那些有反爬虫机制的网站来说,可以轻易的判断你这个请求是爬虫。因此我们要经常设置这个值为一些浏览器的值,来伪装我们的爬虫。

设置headers

1、为什么要设置headers
在请求网页爬取的时候,输出的text信息中会出现抱歉,无法访问等字眼,这就是禁止爬取,需要通过反爬机制去解决这个问题。headers是解决requests请求反爬的方法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。
2、 headers在哪里
谷歌或者火狐浏览器,在网页面上点击右键,–>检查–>Network界面下点击All,然后刷新一下

import requests
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
headers = {'User-Agent':user_agent}
r = requests.get('https://www.baidu.com',headers = headers)
print(r.headers)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章