暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python爬虫基础(Ⅰ) Requests模块

李二白 2021-06-24
918
    在学习爬虫之前,可以先了解一下http协议,url,cookie,以及session等:

HTTP

HypertextTransferProtocol,超文本传输协议

URL

是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源

Cookie

是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息,用于服务器记录客户端的状态

Session

即会话,服务器为每个浏览器创建的一个会话对象,浏览器在第一次请求服务器,服务器便会为这个浏览器生成一个Session对象,保存在服务端,并且把Session的Id以cookie的形式发送给客户端浏览,而以用户显式结束或session超时为结束

在这里不多介绍这些,今天主要内容是介绍一下Requests模块的一些方法和参数。
    Requests模块主要用于进行自动爬取HTML页面和自动网络请求提交。requests的主要对象是请求(Request)和响应(Response)。可以通过requests提供的方法向需要爬取数据的url发起请求然后得到相应的响应
  • 安装
1#安装Requests 模块
2pip install requests # 也可以使用国内的源安装

复制


  • 发起请求时常用的7个方法
1# 请求方法
2requests.get(url,params=None,**kwargs)#请求获取url位置资源
3requests.head(url,**kwargs)#请求获取url位置资源的响应消息报告,即获取头部信息
4requests.post(url,data=None,json=None,**kwargs)#请求向url位置资源后附加新的数据
5requests.put(url,data=None,**kwargs)#请求向erl位置存储一个资源,覆盖原位置资源
6requests.patch(url,data=None,**kwargs)#请求局部更新url位置资源,即改变该处资源的部分内容
7requests.delet(url,**kwargs)#请求删除url位置存储资源
8requests.options(url,**kwargs) # 获取目的资源所支持的通信选项

复制
和以下方法是一样的:
 1# request方法,构造一个请求,支持以下7种基础方法
2requests.request(method,url,**kwargs) 
3# method:请求方式
4requests.request('GET',url,**kwargs) #同上
5requests.request('HEAD',url,**kwargs)
6requests.request('POST',url,**kwargs)
7requests.request('PUT',url,**kwargs)
8requests.request('PATCH',url,**kwargs)
9requests.request('delete',url,**kwargs)
10requests.request('OPTIONS',url,**kwargs)


复制

**kwargs:控制访问参数,均为可选项:

1# { params:字典或字节序列,作为参数增加到url中
2# data:字典、字节序列或文件对象,作为request的内容#向服务器提交
3# json:json格式的数据
4# headers 字典,http定制头
5# cookies:字段或CookieJar,request的cookie
6# auth:元组,支持http认证功能    
7# file:字典,传输文件
8# files={'file':open('data.xlsx','rd')} #以二进制方式读取文件data
9# timeout:设定超时时间,以秒为单位,请求内容未按时返回,产生timeout异常   
10# proxies:字典类型,设定访问代理服务器,可以增加登陆认证
11# allow_redirects:True/False,默认为 True,重定向开关
12# stream:True/False,默认为 True,获取内容立即下载开关
13# verify:True/False,默认为 True,认证SSL证书开关
14# cert:本地SSL证书路径}

复制


  • Response对象的属性

 1# HTTP请求的返回状态,200表示连接成功,404或其他表示失败
2r.status_code
3# HTTP响应内容的字符串形式,即,url对应的页面内容
4r.text
5# 从HTTP header中猜测的响应内容编码方式
6r.encoding
7# 从内容中分析出的响应内容编码方式(备选编码方式)
8r.apparent_encoding 
9# HTTP响应内容的二进制形式
10r.content

复制

Tips:

r.encoding:如果header中不存在charset,则认为编码为ISO‐8859‐1,r.text根据r.encoding显示网页内容

r.apparent_encoding:根据网页内容分析出的编码方式可以看作是r.encoding的备选


  • 实例应用

      以亚马逊和京东的商品页为例,看一下爬取这两个网页时会有什么区别

1#爬取京东任意商详页
2url="https://item.jd.com/100011480214.html"
3r = requests.get(url)
4r.status_code
5-->> 200    #访问成功
6r.encoding
7-->> 'UTF-8'
8r.text[:1000]


复制


1#爬取亚马逊任意商详页
2#我们先看下采用和京东商详页一样代码会得到什么结果
3url="https://www.amazon.cn/dp/B07FKP4R63?ref_=Oct_DLandingS_D_21a8bb9e_60&smid=A3CQWPW49OI3BQ"
4r=requests.get(url)
5r.status_code
6-->>503 #访问失败


复制

查看一下我们发起请求的头部信息:

1r.request.headers
2-->>{'User-Agent''python-requests/2.24.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}

复制

可以从User-Agent 看出,我们的请求被判定为是python请求。说明亚马逊是做了爬虫审批的(关于网站对反爬虫做的一些爬虫审批,爬虫协议等后面会持续更新)。这个时候我们需要定制可访问的头部信息,需要用到hearders参数

 1url="https://www.amazon.cn/dp/B07FKP4R63?ref_=Oct_DLandingS_D_21a8bb9e_60&smid=A3CQWPW49OI3BQ"
2#进入浏览器的开发者模式可以看到浏览期对应的user-agent
3#Mozilla/5.0是目前大多数浏览器在使用的引擎版本
4headers={"user-agent":'Mozilla/5.0'
5r=requests.get(url,headers=headers)
6r.status_code
7-->> 200 #访问成功
8#我们再次查看一下请求的头部信息
9-->>{'user-agent''Mozilla/5.0''Accept-Encoding''gzip, deflate''Accept''*/*''Connection''keep-alive'}
10#为了防止获取的数据过大,我们可以切片展示
11#为了方便在合理展示,我只去倒数50的内容
12r.text[-50:]
13-->>'ndChild(elem);\n    }\n    </script>\n</body></html>\n


复制

如果你把r.text全部打印出来,你会发现显示的内容中有乱码,所以需要来看一下他的编码

1r.encoding
2-->>'ISO-8859-1'
3r.apparent_encoding
4--> 'utf-8'
5#可以用备选编码来替换
6r.encoding=r.apparent_encoding
7#再次打印后结果显示是正常的
8r.text


复制

通常是可以在浏览器的开发者模式下从headers中找到所请求的url的编码类型,一个常规的headers 如下:

1headers = {'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/323.234',
2           'Content-Type''application/json;charset=UTF-8'}

复制
这些信息在浏览器的开发者模式中都是可以找到的,可以在自己的浏览器中点击查看。



推荐两篇文章,可以了解一下爬虫里常用的几个概念,共勉!

爬虫里总是用到的Cookie是什么?

一文彻底搞懂 Cookie、Session、Token 到底是什么


写在最后

      爬虫系列会不定期更新。

      对于我一个代码基础极差的人,爬虫真的有点难。

      但是爬虫是真的很有用,不一定是做什么项目,日常工作中也可以用爬虫来提高工作效率,比如自己写脚本爬取任务信息进行监控,结合邮件,企业微信机器人等进行异常提醒等等,每天可以多睡好几个小时吧也就。

       作为一枚一本正经、好(zhi)高(xiang)骛(yuan)远(da)的分析师,只能硬着秃了头的头皮,哭着也要把爬虫拿下!

       加油

文章转载自李二白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论