个人笔记,仅适合个人使用(大部分摘抄自python修行路

1、爬虫Response的内容

  便是所要获取的页面内容,类型可能是HTML,Json(json数据处理链接)字符串,二进制数据(图片或者视频)

2、请求方式

  主要有:GET/POST两种类型常用,另外还有HEAD/PUT/DELETE/OPTIONS
  GET和POST的区别就是:请求的数据GET是在url中,POST则是存放在头部

  GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问

  POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

  PUT:向指定资源位置上传其最新内容。

  OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

  DELETE:请求服务器删除Request-URI所标识的资源。

3、请求URL

  URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

  URL的格式由三个部分组成:
  第一部分是协议(或称为服务方式)。
  第二部分是存有该资源的主机IP地址(有时也包括端口号)。
  第三部分是主机资源的具体地址,如目录和文件名等。

4、请求头

  包含请求时的头部信息,如User-Agent,Host,Cookies等信息

5、响应状态

  有多种响应状态,如:200代表成功,301跳转,404找不到页面,502服务器错误

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误 常见代码: 200 OK 请求成功 400 Bad Request 客户端请求有语法错误,不能被服务器所理解 401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务 404 Not Found 请求资源不存在,eg:输入了错误的URL 500 Internal Server Error 服务器发生不可预期的错误 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 301 目标永久性转移 302 目标暂时性转移

6、url.lib

  Urllib是python内置的HTTP请求库
  包括以下模块
  urllib.request 请求模块
  urllib.error 异常处理模块
  urllib.parse url解析模块
  urllib.robotparser robots.txt解析模块

urlopen一般常用的有三个参数,它的参数如下:
urllib.requeset.urlopen(url,data,timeout)

异常处理:

URLError,HTTPError,HTTPError是URLError的子类

URLError里只有一个属性:reason,即抓异常的时候只能打印错误信息,类似上面的例子

HTTPError里有三个属性:code,reason,headers,即抓异常的时候可以获得code,reson,headers三个信息

7、requests

  Requests是用python语言基于urllib编写的,封装后方便爬虫

  功能演示

  1. import requests
  2. requests.packages.urllib3.disable_warnings() #https的警告信息去除
  3.  
  4. response = requests.get("https://www.baidu.com",verify=False) #设置verify = False 否则https请求会失败
  5.  
  6. print(response.status_code)
  7.  
  8. #print(response.text)
  9.  
  10. print(response.cookies)
  11.  
  12. print(response.cookies.get_dict())
  13.  
  14. #print(response.content)
  15.  
  16. print(type(response.content))
  17.  
  18. print(response.content.decode("utf-8"))

  六个方法

  1. requests.get()
  2.  
  3. requests.post("http://httpbin.org/post")
  4.  
  5. requests.put("http://httpbin.org/put")
  6. requests.delete("http://httpbin.org/delete")
  7. requests.head("http://httpbin.org/get")
  8. requests.options("http://httpbin.org/get")

  1、get

  1. import requests
  2.  
  3. requests.packages.urllib3.disable_warnings()
  4.  
  5. headers = dict()
  6. headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3387.400 QQBrowser/9.6.11984.400'
  7.  
  8. '''
  9. payload = {'key1': 'value1', 'key2': 'value2'}
  10. ret = requests.get("http://httpbin.org/get", params=payload)
  11.  
  12. print (ret.url)
  13. print (ret.text)
  14. '''
  15.  
  16. url = 'https://github.com'
  17.  
  18. ret = requests.get('https://www.zhihu.com',verify=False, headers = headers)
  19.  
  20. print (ret.url)
  21. print (ret.text[:])

get demo

  json处理

  1. import requests
  2. import json
  3.  
  4. response = requests.get("http://httpbin.org/get")
  5. print(type(response.text))
  6. print(response.json())
  7. print(json.loads(response.text))
  8. print(type(response.json()))

json

  同样的在发送post请求的时候也可以和发送get请求一样通过headers参数传递一个字典类型的数据

  2、post

  1. import requests
  2.  
  3. payload = {'key1': 'value1', 'key2': 'value2'}
  4. ret = requests.post("http://httpbin.org/post", data=payload)
  5.  
  6. print (ret.text)
  7.  
  8. import requests
  9. import json
  10.  
  11. url1 = 'https://api.github.com/some/endpoint'
  12. url = 'http://httpbin.org/post'
  13. payload = {'some': 'data'}
  14. headers = dict()
  15. headers['content-type'] = 'application/json'
  16. headers['User-Agent'] = 'Mozilla/5.0'
  17. print(headers)
  18.  
  19. ret = requests.post(url, data=json.dumps(payload), headers=headers)
  20.  
  21. print (ret.text)
  22. print (ret.cookies.keys)

post demo

 

  1. import requests
  2.  
  3. response = requests.get("http://www.baidu.com")
  4. print(type(response.status_code),response.status_code)
  5. print(type(response.headers),response.headers)
  6. print(type(response.cookies),response.cookies)
  7. print(type(response.url),response.url)
  8. print(type(response.history),response.history)

Code

  3、requests高级用法

  文件上传

  实现方法和其他参数类似,也是构造一个字典然后通过files参数传递

  1. import requests
  2. files= {"files":open("git.jpeg","rb")}
  3. response = requests.post("http://httpbin.org/post",files=files)
  4. print(response.text)

  4、获取cookie

  1. import requests
  2.  
  3. response = requests.get("http://www.baidu.com")
  4. print(response.cookies)
  5.  
  6. for key,value in response.cookies.items():
  7. print(key+"="+value)

  5、会话维持

  cookie的一个作用就是可以用于模拟登陆,做会话维持

  1. import requests
  2. s = requests.Session()
  3. s.get("http://httpbin.org/cookies/set/number/123456")
  4. response = s.get("http://httpbin.org/cookies")
  5. print(response.text)

  这是正确的写法,而下面的写法则是错误的

  1. import requests
  2.  
  3. requests.get("http://httpbin.org/cookies/set/number/123456")
  4. response = requests.get("http://httpbin.org/cookies")
  5. print(response.text)

  因为这种方式是两次requests请求之间是独立的,而第一次则是通过创建一个session对象,两次请求都通过这个对象访问

  6、证书验证

  现在的很多网站都是https的方式访问,所以这个时候就涉及到证书的问题

  1. import requests
  2.  
  3. response = requests.get("https:/www.12306.cn")
  4. print(response.status_code)

  默认的12306网站的证书是不合法的,这样就会提示如下错误

  为了避免这种情况的发生可以通过verify=False
  但是这样是可以访问到页面,但是会提示:
  InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)

  解决方法为:

  1. import requests
  2. from requests.packages import urllib3
  3. urllib3.disable_warnings()
  4. response = requests.get("https://www.12306.cn",verify=False)
  5. print(response.status_code)

  这样就不会提示警告信息,当然也可以通过cert参数放入证书路径

  7、代理设置

  1. import requests
  2.  
  3. proxies= {
  4. "http":"http://127.0.0.1:9999",
  5. "https":"http://127.0.0.1:8888"
  6. }
  7. response = requests.get("https://www.baidu.com",proxies=proxies)
  8. print(response.text)

  如果代理需要设置账户名和密码,只需要将字典更改为如下:
  proxies = {
  "http":"http://user:password@127.0.0.1:9999"
  }
如果你的代理是通过sokces这种方式则需要pip install "requests[socks]"
proxies= {
"http":"socks5://127.0.0.1:9999",
"https":"sockes5://127.0.0.1:8888"
}

超时设置

通过timeout参数可以设置超时的时间

认证设置

如果碰到需要认证的网站可以通过requests.auth模块实现

  1. import requests
  2.  
  3. from requests.auth import HTTPBasicAuth
  4.  
  5. response = requests.get("http://120.27.34.24:9001/",auth=HTTPBasicAuth("user","123"))
  6. print(response.status_code)

  当然这里还有一种方式

  1. import requests
  2.  
  3. response = requests.get("http://120.27.34.24:9001/",auth=("user","123"))
  4. print(response.status_code)

异常处理

关于reqeusts的异常在这里可以看到详细内容:
http://www.python-requests.org/en/master/api/#exceptions
所有的异常都是在requests.excepitons中

从源码我们可以看出RequestException继承IOError,
HTTPError,ConnectionError,Timeout继承RequestionException
ProxyError,SSLError继承ConnectionError
ReadTimeout继承Timeout异常
这里列举了一些常用的异常继承关系,详细的可以看:
http://cn.python-requests.org/zh_CN/latest/_modules/requests/exceptions.html#RequestException

通过下面的例子进行简单的演示

  1. import requests
  2.  
  3. from requests.exceptions import ReadTimeout,ConnectionError,RequestException
  4.  
  5. try:
  6. response = requests.get("http://httpbin.org/get",timout=0.1)
  7. print(response.status_code)
  8. except ReadTimeout:
  9. print("timeout")
  10. except ConnectionError:
  11. print("connection Error")
  12. except RequestException:
  13. print("error")

  其实最后测试可以发现,首先被捕捉的异常是timeout,当把网络断掉的haul就会捕捉到ConnectionError,如果前面异常都没有捕捉到,最后也可以通过RequestExctption捕捉到

Python爬虫笔记(一)的更多相关文章

  1. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

  2. Python爬虫笔记一(来自MOOC) Requests库入门

    Python爬虫笔记一(来自MOOC) 提示:本文是我在中国大学MOOC里面自学以及敲的一部分代码,纯一个记录文,如果刚好有人也是看的这个课,方便搬运在自己电脑上运行. 课程为:北京理工大学-嵩天-P ...

  3. python爬虫笔记Day01

    python爬虫笔记第一天 Requests库的安装 先在cmd中pip install requests 再打开Python IDM写入import requests 完成requests在.py文 ...

  4. Python爬虫笔记(一):爬虫基本入门

    最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫.这是这个项目的第一篇文章,这次就简单介绍一下Python爬虫,后面根据项 ...

  5. Python爬虫笔记安装篇

    目录 爬虫三步 请求库 Requests:阻塞式请求库 Requests是什么 Requests安装 selenium:浏览器自动化测试 selenium安装 PhantomJS:隐藏浏览器窗口 Ph ...

  6. Python爬虫笔记技术篇

    目录 前言 requests出现中文乱码 使用代理 BeautifulSoup的使用 Selenium的使用 基础使用 Selenium获取网页动态数据赋值给BeautifulSoup Seleniu ...

  7. Python爬虫笔记【一】模拟用户访问之设置请求头 (1)

    学习的课本为<python网络数据采集>,大部分代码来此此书. 网络爬虫爬取数据首先就是要有爬取的权限,没有爬取的权限再好的代码也不能运行.所以首先要伪装自己的爬虫,让爬虫不像爬虫而是像人 ...

  8. Python 爬虫笔记(二)

    个人笔记,仅适合个人使用(大部分摘抄自python修行路) 1.使用selenium(传送) selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及 ...

  9. Python 爬虫笔记、多线程、xml解析、基础笔记(不定时更新)

    1  Python学习网址:http://www.runoob.com/python/python-multithreading.html

随机推荐

  1. uniqid()

    uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.

  2. Java基础-synchronized关键字的用法(转载)

    synchronized--同步 顾名思义是用于同步互斥的作用的. 这里精简的记一下它的使用方法以及意义: 当synchronized修饰 this或者非静态方法或者是一个实例的时候,所同步的锁是加在 ...

  3. OpenCV---模糊操作

    推文:图像平滑处理(归一化块滤波.高斯滤波.中值滤波.双边滤波) 推文:图像的平滑与滤波 模糊操作 三种模糊操作方式 均值模糊 中值模糊 自定义模糊(可以实现上面两种模糊方式) 原理: 图像处理:基础 ...

  4. Ubuntu 下安装sqlite3 及常用SQL 语句

    安装sqlite3命令如下: sudo apt-get install sqlite3 创建或者打开已有的数据库文件: sqlite3 test.db 进入数据库后,可以进行以下常用SQL语句操作: ...

  5. 【Nginx】修改响应头,根据不同请求IP重定向到不同IP

    背景: 使用CAS登录的过程中会涉及到三次重定向,如果在同一个局域网内,是没有任何问题的,但如果涉及到跨网访问,这个问题就比较蛋疼了. 解决思路: 通过Nginx对要访问的系统进行代理,根据请求IP来 ...

  6. 【BZOJ】1066: [SCOI2007]蜥蜴

    [算法]网络流-最大流(dinic) [题解] 构图思路: 因为石柱高度是可以被消耗的,即一根石柱可通过的蜥蜴数量有限,取舍问题中这样表示容量的属性显然可以作为网络流中的边. 于是将一根石柱拆成顶部和 ...

  7. 【CodeForces】901 B. GCD of Polynomials

    [题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...

  8. 2、Web基本介绍及Html语法介绍

    1.1 Web基本介绍 1.web就是world wide web的缩写.称之为全球广域网,俗称www.2.我们可以将web理解为就是当前的一种互联网.对于我们来说更多的就是网站服务.3.网站我们可以 ...

  9. 二进制、十进制、十六进制(python)

    int(“x”,base=2/8/16)是把x都转换成十进制 二进制: 1111=1*2的3次方+1*2的2次方+1*2的1次方+1*2的0次方  =8+4+2+1=15 1000=1*2的3次方+0 ...

  10. Perl6多线程3: Promise start / in / await

    创建一个Promise 并自动运行: my $p = Promise.start({say 'Hello, Promise!'}); 如果把代码改成如下, 我们会发现什么也没打印: ;say 'Hel ...