Requests爬虫
一、request入门
之前写过一个urllib的爬虫方法,这个库是python内建的,从那篇文章也可以看到,使用起来很繁琐。现在更流行的一个爬虫库就是requests,他是基于urllib3封装的,也就是将之前比较繁琐的步骤封装到一块,更适合人来使用。
该库中主要有7个方法:request() get() head() post() put() patch() delete() 他们的作用也就是他们的字面意思(例如:get获取网页信息,post提交信息等等),具体的可以自行查询。
下面先从最简单的使用开始,尽可能的用例子展示他都可以干什么。
import requests
r = requests.get("https://www.icourse163.org/home.htm?userId=1021614219#/home/course") # get方法,从网页上获取信息
r.status_code # http请求的返回状态,为200时表示正常访问
print(r.encoding) # 从HTTPheader中猜测的响应内容编码方式
print(r.apparent_encoding) # 从内容分析出响应内容编码方式(备选编码方式)
上面使用get方法就已经得到了网页信息,返回值时200。r字母代表着response,也就是访问网页的响应。网页内的信息可能会有汉字等等,为了方便以后使用,在开始就先说明一下这个,encoding和apparent_encoding在上面解释了,最后是为了使用一个可以把网页正确解析的编码格式。
一般来说,可以使用r.encoding = 'utf-8'或者r.encoding = r.apparent_encoding。
# 已经访问到了网页,那么就要看一下提取到的内容 r.text # http响应内容的字符串形式,url对应的页面内容 r.headers # 返回响应的头部信息 r.content # http响应内容的二进制形式 r.json # 返回json格式,需要提前导入json包
其中二进制格式,可以方便的存储一些图片格式等等的数据,例如需要下载一个照片,可以使用‘wb’格式写到文件当中,当然也可以直接使用库中的方法。
二、异常处理
在我们爬取一些网页的时候,经常会遇到一系列的问题,访问不到页面,禁止访问之类的,或者一些自身代码的一些问题。如果代码量很多,或者具体一点,比如正在从网站爬取一些照片。当跑到其中一张图片时没有正常的访问到,那么整个程序就卡在这里了。后续的照片也就无法爬取了。这当然不是我们想要的,因此就需要一些对异常的处理,让他出现异常时,继续执行后续的程序。异常捕获在python的基础里面已经有了,就是用那个在这里应用一下。
import requests
from requests.exceptions import ReadTimeout, ConnectionError, RequestException
try:
response = requests.get("http://httpbin.org/get", timeout = 0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
except ConnectionError:
print('Connection error')
except RequestException:
print('Error')
如果是刚接触的人可能看到这么多长串的字符有些记不清,其实也可以先不去管他是什么样的异常,只要是异常就反馈回来。
response.raise_for_status() 这个方法可以捕获异常,使得出现异常时就会跳到except中执行,而不影响整体进程。下面是一个通用的格式来捕获异常。
import requests def getHtmlText(url):
try:
r = requests.get(url)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding # 不论headers中是否要求编码格式,都从内容中找到实际编码格式,确保顺利解码
return r.text
except:
return '产生异常'
if __name__ == "__main__":
url = "http://baidu.com"
print(getHtmlText(url))
三、插一个小栗子
爬取京东上面商品的页面。理一下思路:
首先要导入网络请求的包(requests)-->通过get方法访问网页-->捕获一下异常看看是否正常访问到页面-->如果返回200,确定编码格式-->通过response.text查看一下得到的内容是不是想要的。
import requests
url = "https://item.jd.com/8578888.html"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:500]) # 由于网页内容比较多,[:500] 表示只看其从0到500个字节的内容
except:
print("爬取失败")
四、模拟浏览器
上面访问的网站并没有什么防护,但是现在越来越多的网站都是有各种各样的反爬虫机制,其中一种简单的方法就是通过发送请求时头文件中的内容来判断。通过response.headers可以找到访问时候的User-Agent为requests,也就是告诉网站是通过爬虫来访问的。这么明显,当然有些网站会阻止访问。这时候有一个办法,就是用一个浏览器来模拟一下,替换掉User-Agent中的内容。网上搜会有很多,或者直接从你电脑上的浏览器中检查,来查看你的浏览器在访问网页时显示的User-Agent是什么样的。
通过headers,传入一个字典,例如:{"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}
其实,如果还不放心的话,可以搜一些User-Agent,每次通过随机抽取其中的一个来访问网页,来避免被网站发现。
下面套用上面给出的框架来写这个爬虫:
# 模拟浏览器爬取信息
import requests
url = "https://www.amazon.cn/dp/B074BNFY1H/ref=cngwdyfloorv2_recs_0?pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e&pf_rd_s=desktop-2&pf_rd_t=36701&pf_rd_i=desktop&pf_rd_m=A1AJ19PSB66TGU&pf_rd_r=2JDNVB7YD5ZF07YQSRQ6&pf_rd_r=2JDNVB7YD5ZF07YQSRQ6&pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e"
try:
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}
r = requests.get(url, headers = headers)
print(r.request.headers) # 起初发现503错误,因为亚马逊会限制爬虫,当使用爬虫时,会在头部显示request代理。因此用一个新的user-agent代替原来的
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:500])
except:
print("爬取失败")
五、超时设置
# 当访问长时间未响应时就不再等待,因为毕竟爬虫时为了提高效率
import requests
from requests.exceptions import ReadTimeout
try:
response = requests.get("http://httpbin.org/get", timeout = 0.5)
response.raise_for_status()
except:
print('Timeout')
六、IP代理
# 在访问网站时有可能你没有遵守该robots协议,面临被封IP的风险,这样该IP就不能再访问了,大概过段时间才把你从黑名单中拿出来,这时候就用到了IP代理,这个大概介绍一下,因为本人也是初学,能力有限
import requests
proxies = {
"http": "***************" }
response = requests.get("https://www.taobao.com", proxies=proxies)
print(response.status_code)
七、cookie
这是浏览器缓存,就是我们在之前访问过该网站后,后留下一下脚印,例如之前请求到的一些信息,或者提交,比如需要登录的网站,短时间内再次进入时候不需要再次输入账户密码。因此http请求要从很远的服务器中拉取你要的信息,当然效率不会很高,所以,他就会在本地的浏览器中暂且保留一段时间的信息,这段时间内登录就是从本地来得到网页响应,也会相对快一些。
在爬虫的时候,尤其是需要登录才能访问的页面,为了让他可以自动化的一直爬取信息,就可以预先找到登录后在该网页留下的脚印,来放到你的爬虫里,让其自动登录爬取。
import requests
response = requests.get("https://www.baidu.com")
print(response.cookies) # 可以直接调用方法得到当前访问页面时的cookie
在需要登录的网页时,我们需要同时请求多个端口来实现,可以用到requests.session(),看一个例子体会一下。
import requests s = requests.Session()
s.get('http://httpbin.org/cookies/set/****/*****')
response = s.get('http://httpbin.org/cookies') # 在访问页面的同时打开之前的cookie请求。如果使用requests的get方法的话,你会发现,第一次请求之后,第二次的get是开启的一个新的请求,而不是针对同一个对象,因此不能实现
print(response.text)
这点东西并没有讲清楚,待我再好好学一下再解释。
Requests爬虫的更多相关文章
- requests 爬虫
爬虫 常用爬虫爬取网页,但如果一直爬取会被ban掉,因此需要对爬虫进行一些改进反反爬 使用requests和beautifulsoup4构建爬虫,1.随机user-agent:2.ip代理:4.coo ...
- 一:requests爬虫基础
一,什么是爬虫? 描述: 本质是一个自动化程序,一个模拟浏览器向某一个服务器发送请求获取响应资源的过程. 爬虫的基本流程 robots.txt协议 编写一个robots.txt的协议文件来约束爬虫程序 ...
- python +requests 爬虫-爬取图片并进行下载到本地
因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地 爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...
- python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...
- requests爬虫get请求
1.简单get请求 url = 'https://www.baidu.com' headers = { 'accept': 'text/html,application/xhtml+xml,appli ...
- 爬虫入门系列(三):用 requests 构建知乎 API
爬虫入门系列目录: 爬虫入门系列(一):快速理解HTTP协议 爬虫入门系列(二):优雅的HTTP库requests 爬虫入门系列(三):用 requests 构建知乎 API 在爬虫系列文章 优雅的H ...
- Python简单爬虫Requests
首先添加库 附配环境变量:安装环境变量 cmd==> 输入指令: path=%path%;C:\Python(Python安装路径) 回车 python2.7版本可能没有pip的话可以先到www ...
- 爬虫框架 Scrapy
一 介绍 crapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用 ...
- 爬虫模块介绍--request(发送请求模块)
爬虫:可见即可爬 # 每个网站都有爬虫协议 基础爬虫需要使用到的三个模块 requests 模块 # 模拟发请求的模块 PS:python原来有两个模块urllib和urllib的升级urlli ...
随机推荐
- Javascript数组系列一之栈与队列
所谓数组(英语:Array),是有序的元素序列. 若将有限个类型相同的变量的集合命名,那么这个名称为数组名. 组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量. ---百度百科 ...
- vim 基础命令大全
VIM命令大全 光标控制命令 命令 光标移动h 向左移一个字符j 向下移一行k ...
- Linux 系统出现电流音解决方案
迫于Windows 系统最近的各种故障,今天脱坑换了openSUSE Linux ,在上网途中播放视频时偶尔会出现电流音,虽然影响不大,但是还是进行了一些排查. 通过观察电流音出现时的系统负载的波段, ...
- 如何进行Apache虚拟机设置
摘要:虚拟机Apache设置很多用户都遇到过,具体如何进行虚拟机Apache设置?怎样才能让虚拟机Apache设置达到最简单,最优化?本文为您讲解. Apache虚拟机设置有两种方法: 基于主机名的虚 ...
- docker 私有仓库简易搭建
概要 本地私有仓库 局域网私有仓库 总结 概要 docker hub 使用非常方便,而且上面有大量的镜像可以使用. 但是,每次都远程下载镜像速度非常慢,如果能在本地做一个 docker 的仓库,多人协 ...
- python的shelve模块
shelve shelve是一额简单的数据存储方案,他只有一个函数就是open(),这个函数接收一个参数就是文件名,并且文件名必须是.bat类型的.然后返回一个shelf对象,你可以用他来存储东西,就 ...
- (转)Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
http://www.ityouknow.com/springboot/2018/03/28/dockercompose-springboot-mysql-nginx.html 我知道大家这段时间看了 ...
- linux 软连接创建 压缩解压缩 linux的dns服务相关
linux软连接创建 注意用绝对路径,语法如下 ln -s 目标文件绝对路径 软连接名字绝对路径 ln -s /小护士.txt /tmp/hs.txt 修改linux的PS1变量,命令提示符变量 PS ...
- 快速排序 O(n logn) 堆排序 O(n logn) 归并排序 O(n logn)
NB三人组 快速排序 思路" 取一个元素P (第一个元素), 使元素归位 列表被P 分成两部分,左边都比P小,右边比P大; 递归完成排序. 问题 如果是已经排序好的 倒叙 列表 则会 递归深 ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
