当前位置: 首页 > 科技观察

自动评论为什么要学习爬虫,只需要掌握Requests库

时间:2023-03-19 13:49:35 科技观察

网络库requests其实我们有专门的网络库直接进行网络请求和处理,就是requests库。在开始讲解和使用之前,我们需要通过以下命令进行安装:pipinstallrequests首先我们来看看requests库可以进行哪些操作:1.发送HTTP请求2.上传文件3.处理Cookies4.支持Session会话5.使用Proxy6.身份验证7.打包请求8.SSL证书验证接下来我们一一介绍一下这些操作是如何实现的。发送HTTP请求与urllib和urllib3相同,HTTP请求常用GET请求和POST请求。GET请求其中,GET请求使用的方法是requests.get()。它可以设置参数params、timeout超时时间和请求头。示例如下:importrequestsurl="https://www.csdn.net/"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}result=requests.get(url=url,timeout=1,headers=headers)#打印网页源代码print(result.text)#打印响应状态码print(result.status_code)#PrintCookieprint(result.cookies)#Printresulttypeprint(type(result))运行后输出如下:POST请求下面介绍一下POST请求。在这里,我们也使用测试网站http://httpbin.org/post并向其发送一些数据。示例如下:importrequestsurl="http://httpbin.org/post"data={"name":"liyuanjing","age":"29"}headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}result=requests.post(url=url,timeout=1,headers=headers,data=data)#打印网页源代码print(result.text)#转换为jsonprint(result.json())运行,效果如下:抓取一个二值图像对于文本文件的获取,我们简单的处理分析一下他们通过文字。但是如果我们得到的是图片,显然文字是无法还原真实内容的。不仅如此,图片的文字也是乱码。因此,我们需要通过相应的API,将获取到的图像二进制数据保存为文件。示例代码如下:importrequestsurl="https://img1.baidu.com/it/u=954496120,1621506021&fm=26&fmt=auto&gp=0.jpg"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}result=requests.get(url=url,timeout=1,headers=headers)withopen('requests.png','wb')asf:f.write(result.content)运行后,会在程序目录的statistics目录下生成一张图片。当然,读者可以自行查找图片链接。这里的链接暂时有效。需要注意的是response.text是Unicode编码,而response.content是原始的二进制字节流。这一点需要格外注意。如果网页出现乱码,可以使用response.encoding="gbk"设置分析。上传文件和说明urllib3一样。这里上传文件的服务器端口是flask写的。我们先看下服务端代码:request.files['file']iffile:file.save(os.path.join(UPLOAD_FILE,os.path.basename(file.filename)))return'文件上传成功'else:return'文件上传失败'if__name__=='__main__':app.run()运行这段代码,默认会一直运行等待。而使用requests上传文件也很简单,因为文件上传是一个Post请求,我们只需要设置file参数即可。示例如下:importrequestsurl="http://127.0.0.1:5000"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0。4472.124Safari/537.36'}files={"file":open('123.png','rb')}result=requests.post(url=url,files=files)print(result.text)将运行添加一个项目文件uploads文件夹下的123.png图片。当然,上传123时的文件必须存在。还要提前创建上传文件夹。处理Cookie一般而言,爬虫分为两部分:首先登录,然后爬取。在登录的时候,我们一般使用selenium来返回cookies。然后使用requests爬取网页源码,因为selenium是一个特殊的库,后面会介绍,这里先假设我们已经获取到了cookie。直接把cookie设置到requestheader中比较有趣,我们在chrome中按F12后,用浏览器评论一个CSDN的帖子,会抓取如下图的请求数据:在这里,我们可以复制cookie数据到我们的标头。同时下面有一个提交表单,其中content是我们在CSDN评论的内容,articleId是我们在CSDN评论的帖子,读者可以自行查看CSDN帖子中是否有一串数字。通过请求头在CSDN上评论。然后,我们就可以模仿这个请求连接,通过请求完成CSDN的评论操作。示例代码如下:importrequestsurl="https://blog.csdn.net/phoenix/web/v1/comment/submit"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36','cookie':'CSDN登录后返回cookie',}data={"commentId":"","content":"I'最近在学习,刚好可以使用","articleId":"118750834",}result=requests.post(url=url,data=data,headers=headers)print(result.status_code)运行后,控制台会输出200,同时在评论帖子下还会多出一个评论数据,如下图:RequestsCookieJar()除了通过请求头设置Cookie来访问之外,其实我们的post()方法还有一个特殊的cookies参数,用于接收RequestsCookieJar对象。示例如下:importrequestsurl="https://blog.csdn.net/phoenix/web/v1/comment/submit"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36',}cookieStr='CSDN登录后返回的cookie'data={"commentId":"","content":"我最近在学习,正好可以使用它","articleId":"118517922",}jar=requests.cookies.RequestsCookieJar()forcookieincookieStr.split(";"):key,value=cookie.split('=',1)jar.set(key,value)result=requests.post(url=url,data=data,headers=headers,cookies=jar)print(result.status_code)这段代码和上一段效果一样,运行结果不再这里的输出,只是cookies不同形式的使用方式。Session会话cookie数据保存在客户端,session数据保存在服务器端,一个Session代表一个特定的客户端。那么具体的客户端如何与服务器上的Session对象建立连接呢?通常,一个ID在客户端和服务器之间来回传递。通过这个ID,客户端可以在服务器上找到对应的Session对象。.在实际的爬虫项目中,有时需要使用同一个客户端多次爬取页面,那么就可以使用Session。示例代码如下:result=requests.post(url=url,data=data,headers=headers,cookies=jar)session=requests.Session()r2=session.post(url=url,data=data,headers=headers,cookies=jar)print(r2.status_code)这里,我们可以更改上面的cookie代码。使用代理对于requests库来说,使用代理非常简单,因为get和post函数都有一个proxies参数,用来设置代理。示例如下:importrequestsurl="https://www.csdn.net/"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36',}proxies={'http':'http://183.47.138.80:8888','http':'http://125.78.226.217:8888'}result=requests.post(url=url,proxies=proxies)需要注意的是,这里的代理IP博主测试是有效的,但是读者在阅读的时候可能已经失败了。读者可以到网上搜索免费代理测试。除了基本的HTTP代理,Request还支持SOCKS代理。这是一项可选功能,要使用它,您需要使用以下命令安装第三方库。安装pipinstallrequests[socks]后,只需替换代理即可。proxies={'http':'socks5://user:pass@host:port','https':'socks5://user:pass@host:port'}认证请求库也提供认证功能,其中,get和post方法都有一个auth参数专门用于认证,传入的参数是HTTPBasicAuth。示例代码如下:importrequestsfromrequests.authimportHTTPBasicAuthurl="https://www.csdn.net/"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36',}result=requests.post(url=url,auth=HTTPBasicAuth('name','password'))print(result.status_code)这里只是为了展示读者如何通过代码进行身份验证。如果自己写服务器,可以通过上面的代码进行操作,这里就不写了。不管是上面的get请求还是post请求,我们都是通过requests.get或者requests.post来操作的,但实际上我们可以将请求参数单独列出来进行打包。即俗称封装。示例代码如下:importrequestsurl="https://www.csdn.net/"headers={'user-agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36',}req=requests.Request('get',url=url,headers=headers)session=requests.Session()prepared=session.prepare_request(req)result=session.send(prepared)print(result.text)这里,通过Request封装请求数据,然后调用Session的prepare_request方法处理Request对象,返回一个requests.models.Response对象。最后,通过Session.send方法发送Response对象。SLL证书验证在requests请求中,有一个verify参数。访问HTTPS时,如果需要验证SSL证书,可以不设置该数据,默认为True验证证书。如果不需要验证证书,可以将verify设置为False,则不进行验证。验证码很简单,什么都不做,代码如下:importrequeststry:url="https://www.csdn.net/"result=requests.get(url)print(result.status_code)exceptrequests.exceptions.SSLErrorase:print(e.args[0])如果你的网站没有SLL证书,或者证书没有经过权威机构认证,会抛出SSLError异常。如果你的网站有SLL证书,并且通过了权威认证,那么就不会抛出异常。而如果不想验证证书,可以修改代码为如下代码:importrequeststry:urllib3.disable_warnings()url="https://www.csdn.net/"result=requests.get(url,verify=False)print(result.status_code)exceptrequests.exceptions.SSLErrorase:print(e.args[0])但是会报InsecureRequestWarning警告信息。如果需要禁止警告信息的输出,可以使用urllib3.disable_warnings()来屏蔽。