爬虫基础之requests模块
requests介绍
requests模块Python网络爬虫中一个专业用于模拟浏览器发送网络请求的模块,其功能之强大,用法之简单超乎了你的想象。所以掌握了requests模块的应用,也就证明你掌握了爬虫世界的半壁江山
安装
pip进行安装:pip insrall requests
requests的get请求
import requests url = "https://www.sogou.com/web" # 对url携带的参数进行字典形式的封装,封装好后,将字典赋值给get方法的params参数即可 param = { 'query':'美女图片' } response = requests.get(url=url,params=param) page_text = response.text #文件实例化 fp = open('./meinv.html','w',encoding='utf-8') fp.write(page_text) fp.close()
响应对象的相关操作
#使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象 response = requests.get(url) #获取请求的url print('请求的url:'+response.url) #获取响应状态码 print(response.status_code) #获取响应内容的编码格式,可以通过该属性修改响应的编码格式 print('响应内容编码:'+response.encoding) #获取响应对象的响应头信息: print(response.headers) #获取字符串形式的响应内容 print(response.text) #获取字节形式的响应内容 print(response.content)
定制请求头信息
在请求头中有一个参数为User-Agent,表示含义为请求载体的身份标识。通过浏览器发起的请求,请求载体为浏览器,则该请求的User-Agent为浏览器的身份标识,使用爬虫程序发起的请求,则该请求的载体为爬虫程序,则该请求的User-Agent为爬虫程序的身份标识。爬虫程序想要尽可能的模拟浏览器发起的请求,则必须将User-Agent修改成浏览器的身份标识
【注意】User-Agent的定制其实是一种反反爬虫的初级技术手段。所以在编写爬虫程序时,必须对User-Agent进行手动定制。User-Agent的值可以通过抓包工具从浏览器请求的请求头中获取
import requests url = 'http://www.baidu.com' #定制请求头信息(在url下面添加) headers = { # 对UA进行重写操作(伪装) 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } #使用requests模块的get函数根据指定的url发起一个get请求,get函数返回一个响应对象 #参数1:发起请求指定的url #参数2:手动定制的请求头信息 response = requests.get(url=url,headers=headers)
requests的post请求
# 登录豆瓣电影,爬取登录成功后的页面数据 import requests #登录成功后拿到的数据 #1 指定url url = 'https://accounts.douban.com/login' # 进行post请求的参数处理 data = { 'ck':'TNmg', 'source':'movie', 'redir':'https://movie.douban.com/', 'form_email':'1506353195@qq.com', 'form_password':'xing150635', 'login':'登录' } 2 请求发送 post #headers 表示的是自制定的请求头信息 headers = { # 对UA进行重写操作(伪装) 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } response = requests.post(url=url , data=data ,headers=headers) #3 获取响应数据 page_text = response.text #4 持久化 fp = open('./douban.html','w',encoding='utf-8') fp.write(page_text) fp.close()
基于Ajax的get请求
#需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 import requests url = 'https://movie.douban.com/j/chart/top_list?' #针对get请求参数处理 param = { 'type':'13', 'interval_id':'100:90', 'action':'', 'start':'40', 'limit':'20', } headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } response = requests.get(url=url,params=param) print(response.text)
参数获取方法:

基于Ajax的post请求
import requests # 肯德基餐厅查询数据爬取 http://www.kfc.com.cn/kfccda/index.aspx url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } data = { 'cname':'北京', 'pid':'', 'keyword':'北京', 'pageIndex':'3', 'pageSize':'10', } response = requests.post(url=url,data=data,headers=headers) print(response.text)
requests爬取分页的页面数据
import requests # 获取搜狗知乎指定词条指定页码下的页面数据 url = 'https://zhihu.sogou.com/zhihu?' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } word = input('enter a word:') start_page = int(input('start page:')) end_page = int(input('end page:')) for page in range(start_page,end_page+1): param = { 'query':word, 'page':str(page) } response = requests.get(url=url,params=param,headers=headers,proxies={"http":'199.254.222.96:80'}) #proxies后面跟代理ip,地址可从该网站获取 page_text = response.text file_name = word + str(page) + '.html' with open(file_name,'w',encoding='utf-8') as fp: print('爬取倒了第%s页的数据'%page) fp.write(page_text)
获取糗图百科中糗图数据
# 获取糗事百科所有糗图下载 import request import os import re # 判断文件存储目录是否存在 if not os.path.exists('qiutu'): os.mkdir('qiutu') url = 'https://www.qiushibaike.com/pic/' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } response = requests.get(url=url,headers=headers) page_text = response.text #数据解析:将页面中所有的图片数据爬取 # 根据正则获取的页面源码中所有的图片链接 img_url = re.findall('<div class="thumb">.*?<img src="(.*?)" .*?',page_text,re.S) # 根据图片链接发起请求,获取图片的二进制数据 for url in img_url: url = "https:" + url img_response = requests.get(url=url,headers=headers) # 获取二进制数据 bytes img_data = img_response.content imgName = url.split('/')[-1] imgPath = 'qiutu/' + imgName with open(imgPath,'wb') as fp: print(imgPath + '存储成功!') fp.write(img_data)

浙公网安备 33010602011771号