什么是requests模块
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
优点:自动处理url编码
自动处理post请求参数
简化cookie和代理操作
如何使用requests模块
安装: pip install requests
使用流程: 指定url
基于requests模块发起请求
获取响应对象中的数据值
持久化存储
请求载体身份标识的伪装:
- User-Agent:请求载体身份标识,通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。可以通过判断该值来获知该请求的载体究竟是基于哪款浏览器还是基于爬虫程序。
- 反爬机制:某些门户网站会对访问该网站的请求中的User-Agent进行捕获和判断,如果该请求的UA为爬虫程序,则拒绝向该请求提供数据。
- 反反爬策略:将爬虫程序的UA伪装成某一款浏览器的身份标识。
session处理cookie
cookie概念:当用户通过浏览器首次访问一个域名时,访问的web服务器会给客户端发送数据,以保持web服务器与客户端之间的状态保持,这些数据就是cookie。
cookie作用:我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
当我们爬取一个登陆后的网页的详情数据的时候 就需要带上我们的个人账号信息才能爬取到所需要的数据 此时就需要携带登陆时的cookie
proxies参数设置请求代理ip
- 什么是代理
- 代理就是第三方代替本体处理相关事务。例如:生活中的代理:代购,中介,微商......
- 爬虫中为什么需要使用代理
- 一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理IP,每隔一段时间换一个代理IP,就算IP被禁止,依然可以换个IP继续爬取。
- 代理的分类:
- 正向代理:代理客户端获取数据。正向代理是为了保护客户端防止被追究责任。
- 反向代理:代理服务器提供数据。反向代理是为了保护服务器或负责负载均衡。
- 免费代理ip提供网站
- http://www.goubanjia.com/
- 西祠代理
- 快代理
import requests import random #不同浏览器的UA header_list = [ # 遨游 {"user-agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)"}, # 火狐 {"user-agent": "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"}, # 谷歌 { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"} ] #不同的代理IP proxy_list = [ {"http": "112.115.57.20:3128"}, {‘http‘: ‘121.41.171.223:3128‘} ] #随机获取UA和代理IP header = random.choice(header_list) proxy = random.choice(proxy_list) url = ‘http://www.baidu.com/s?ie=UTF-8&wd=ip‘ #参数3:设置代理 response = requests.get(url=url,headers=header,proxies=proxy)
示例
基于multiprocessing.dummy线程池的数据爬取
import requests,re,random from lxml import etree from multiprocessing.dummy import Pool headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36‘} def request_video(url): return requests.get(url=url,headers=headers).content def saveVideo(data): name = str(random.randint(0,9999))+‘.mp4‘ with open(name,‘wb‘) as fp: fp.write(data) print(name,‘下载存储成功!!!‘) url = ‘https://www.pearvideo.com/category_1‘ page_text = requests.get(url=url,headers=headers).text tree = etree.HTML(page_text) li_list = tree.xpath(‘//ul[@id="listvideoListUl"]/li‘) pool = Pool(4)#实例化一个线程池对象 video_url_list = [] #所有的视频连接 for li in li_list: detail_url = ‘https://www.pearvideo.com/‘+li.xpath(‘./div/a/@href‘)[0] detail_page_text = requests.get(url=detail_url,headers=headers).text ex = ‘srcUrl="(.*?)",vdoUrl=‘ video_url = re.findall(ex,detail_page_text,re.S)[0] video_url_list.append(video_url) video_data_list = pool.map(request_video,video_url_list)#异步的获取4个视频的二进制数据 pool.map(saveVideo,video_data_list)#进行视频的持久化存储
原文地址:https://www.cnblogs.com/z1115230598/p/10976408.html
时间: 2024-10-07 10:54:00