一、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爬虫的更多相关文章

  1. requests 爬虫

    爬虫 常用爬虫爬取网页,但如果一直爬取会被ban掉,因此需要对爬虫进行一些改进反反爬 使用requests和beautifulsoup4构建爬虫,1.随机user-agent:2.ip代理:4.coo ...

  2. 一:requests爬虫基础

    一,什么是爬虫? 描述: 本质是一个自动化程序,一个模拟浏览器向某一个服务器发送请求获取响应资源的过程. 爬虫的基本流程 robots.txt协议 编写一个robots.txt的协议文件来约束爬虫程序 ...

  3. python +requests 爬虫-爬取图片并进行下载到本地

    因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地   爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...

  4. python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。

    Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类型]间进 ...

  5. requests爬虫get请求

    1.简单get请求 url = 'https://www.baidu.com' headers = { 'accept': 'text/html,application/xhtml+xml,appli ...

  6. 爬虫入门系列(三):用 requests 构建知乎 API

    爬虫入门系列目录: 爬虫入门系列(一):快速理解HTTP协议 爬虫入门系列(二):优雅的HTTP库requests 爬虫入门系列(三):用 requests 构建知乎 API 在爬虫系列文章 优雅的H ...

  7. Python简单爬虫Requests

    首先添加库 附配环境变量:安装环境变量 cmd==> 输入指令: path=%path%;C:\Python(Python安装路径) 回车 python2.7版本可能没有pip的话可以先到www ...

  8. 爬虫框架 Scrapy

    一 介绍 crapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用 ...

  9. 爬虫模块介绍--request(发送请求模块)

    爬虫:可见即可爬   # 每个网站都有爬虫协议 基础爬虫需要使用到的三个模块 requests 模块  # 模拟发请求的模块 PS:python原来有两个模块urllib和urllib的升级urlli ...

随机推荐

  1. 关于谷歌JSV8与微软JSRT的性能比较

    首先,我并没有得到实际的比较结果,望有兴趣的朋友可以帮助完成这个比较. benchmarksgame,提供了各种语言的性能比较,但都为linux下的测试,很难比较谷歌与微软的东西. 众所周知,JSV8 ...

  2. C#-封装(七)

    封装概念 C#是面向对象的一门语言,面向对象的语言有三大特性:封装.继承.多态.而封装可以实现一个自定义的类,从而定义新的对象 封装是将一个或多个项目集合在一个单元中,这个单元称之为类.这样可以防止对 ...

  3. python--私有属性--私有方法

    Class 定义类 def 初始化方法(形参) 属性1 属性2   私有属性(属性之前加--) def  方法1() print() 属性和方法定义好以后,在创建对象 对象=类名(“”) print( ...

  4. 一、Selenium 工作原理

    1.Selenium介绍 Selenium是用于测试Web应用程序用户界面UI的常用框架.端对端的功能测试.并且在一个多个浏览器中操作. 目前Seienium 组件主要包括Selenium IDE   ...

  5. jenkins 构建到最后报权限的问题

    参考链接  https://blog.csdn.net/sinat_25306771/article/details/54633921 近整理虚拟机的密码  把Jenkins构建相关的远程执行脚本的服 ...

  6. 你可能不知道的printf

    前言 printf可能是我们在学习C语言的过程中最早接触的库函数了.其基本使用想必我们都已经非常清楚了.但是下面的这些情况你是否已经清楚地知道了呢? 示例程序 我们来看一个示例程序,看看你能否对下面的 ...

  7. 转 jQuery中的$.extend方法来扩展JSON对象

    $.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...

  8. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  9. Mysql 数据类型 以及约束

    数据类型 整型 默认有符号 无符号(unsigned) 和有符号 用 0 填充 zerofill 约束的作用: 保证数据的完整性 和一致性 tinyint[ -128 , 127 ] 小整数 无符号( ...

  10. [Git] Git操作命令

    基础操作 git配置 git config --global user.name "Your Name" git config --global user.email " ...