python网络爬虫之requests模块
  • session处理cookie
  • proxies参数设置请求代理ip
  • 基于线程池的数据爬取
一 获取验证码

步骤:

​ 1 注册云大码 http://www.yundama.com/about.html

​ 2登录 开发者登录 和用户者登录

3 在开发者登录成功之后,创建新软件

4点击开发者中心

5 点击进入Pythonhttp下载

6 选择所需的版本下载即可

获取验证码

import http.client, mimetypes, urllib, json, time, requests######################################################################class YDMHttp:apiurl = 'http://api.yundama.com/api.php'username = ''password = ''appid = ''appkey = ''def __init__(self, username, password, appid, appkey):self.username = username  self.password = passwordself.appid = str(appid)self.appkey = appkeydef request(self, fields, files=[]):response = self.post_url(self.apiurl, fields, files)response = json.loads(response)return responsedef balance(self):data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey}response = self.request(data)if (response):if (response['ret'] and response['ret'] < 0):return response['ret']else:return response['balance']else:return -9001def login(self):data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey}response = self.request(data)if (response):if (response['ret'] and response['ret'] < 0):return response['ret']else:return response['uid']else:return -9001def upload(self, filename, codetype, timeout):data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}file = {'file': filename}response = self.request(data, file)if (response):if (response['ret'] and response['ret'] < 0):return response['ret']else:return response['cid']else:return -9001def result(self, cid):data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid)}response = self.request(data)return response and response['text'] or ''def decode(self, filename, codetype, timeout):cid = self.upload(filename, codetype, timeout)if (cid > 0):for i in range(0, timeout):result = self.result(cid)if (result != ''):return cid, resultelse:time.sleep(1)return -3003, ''else:return cid, ''def report(self, cid):data = {'method': 'report', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'cid': str(cid), 'flag': '0'}response = self.request(data)if (response):return response['ret']else:return -9001def post_url(self, url, fields, files=[]):for key in files:files[key] = open(files[key], 'rb');res = requests.post(url, files=files, data=fields)return res.text####################################################################### 云打码中的用户名(普通用户)
username    = 'molihua'# 云打码中的密码
password    = 'MLH19960208'                            # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
appid       = 7025                                  # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
appkey      = '2d96c723a682c882faa73257e98440d7 '    # 图片文件
filename    = 'getimage.jpg'                        # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
codetype    = 1004# 超时时间,秒 自定义
timeout     = 10                                   # 检查
if (username == 'username'):print('请设置好相关参数再测试')
else:# 初始化yundama = YDMHttp(username, password, appid, appkey)# 登陆云打码uid = yundama.login();print('uid: %s' % uid)# 查询余额balance = yundama.balance();print('balance: %s' % balance)# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果cid, result = yundama.decode(filename, codetype, timeout);print('cid: %s, result: %s' % (cid, result))
需求 通过登录人人网来获取主页面
import requests
import urllib
from lxml import etree#获取session对象
session=requests.Session()
url='http://www.renren.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:65.0) Gecko/20100101 Firefox/65.0'
}
renren_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(renren_text)
code_img_url = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
urllib.requests.urlretrieve(url=code_img_url,filename='code.jpg')#识别验证码图片中的数据值code_data = getCodeDate('15204558261','MLH19960208','./code.jpg',2004)
print(code_data)login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019142013687'##通过抓包工具来获取
data ={'email':'15204558261''icode': code_data'origURL':'http://www.renren.com/home''domain':'renren.com''key_id':'1''captcha_type':'web_login''password':'7bf638cc5b01b15b9416bf17fb98a1eda46da861c139b563a4c670fb21884336''rkey':'cf9180c5afba43cb1f089b953e67b567''f':'http%3A%2F%2Fwww.renren.com%2F296856777%2Fprofile'
}
#该次请求产生的cookie会被自动存储到session对象中session.post(url=login_url,data=data,headers=headers)
url='http://www.renren.com/296856777/profile'
page_text = session.get(url=url,headers=headers).textwith open('renren.html','w',encoding='utf-8') as fp:fp.write(page_text)
基于multiprocessing.dummy线程池的数据爬取
import requests
import random
from lxml import etree
import re
from fake_useragent import UserAgent
#安装fake-useragent库:pip install fake-useragent
#导入线程池模块
from multiprocessing.dummy import Pool
#实例化线程池对象
pool = Pool()
url = 'http://www.pearvideo.com/category_1'
#随机产生UA
ua = UserAgent().random
headers = {'User-Agent':ua
}
#获取首页页面数据
page_text = requests.get(url=url,headers=headers).text
#对获取的首页页面数据中的相关视频详情链接进行解析
tree = etree.HTML(page_text)
li_list = tree.xpath('//div[@id="listvideoList"]/ul/li')detail_urls = []#存储二级页面的url
for li in li_list:detail_url = 'http://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]title = li.xpath('.//div[@class="vervideo-title"]/text()')[0]detail_urls.append(detail_url)vedio_urls = []#存储视频的url
for url in detail_urls:page_text = requests.get(url=url,headers=headers).textvedio_url = re.findall('srcUrl="(.*?)"',page_text,re.S)[0]vedio_urls.append(vedio_url)
#使用线程池进行视频数据下载
func_request = lambda link:requests.get(url=link,headers=headers).content
video_data_list = pool.map(func_request,vedio_urls)
#使用线程池进行视频数据保存
func_saveData = lambda data:save(data)
pool.map(func_saveData,video_data_list)
def save(data):fileName = str(random.randint(1,10000))+'.mp4'with open(fileName,'wb') as fp:fp.write(data)print(fileName+'已存储')pool.close()
pool.join()
requests模块的代理
什么是代理???

​ 代理就是第三方代替本体来处理相关的事务。列如:中介,微商,代购等

那么问题来了,爬虫为什么要用到代理呢?

​ 这是因为有一些网站它会采取相关的反爬措施。列如一些网站会通过检测某一段时间某个IP访问的次数,如果访问太过于频繁,那么它就会知道可能不是正常的用户,会禁止掉这个IP的访问。所以我们可以使用代理IP来爬取我们需要的数据,就算是某一个IP一段时间被禁止掉,也可以换另一个代理

IP去爬取数据。是不是觉得非常的神奇呢

代理的分类:

正向代理:代理客户端获取数据

反向代理:代理服务端提供数据

免费代理IP的网站:

http://www.goubanjia.com/

快代理

import requests
import random
if __name__ == "__main__":#不同浏览器的UAheader_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"}]#不同的代理IPproxy_list = [{"http": "112.115.57.20:3128"},{'http': '121.41.171.223:3128'}]#随机获取UA和代理IPheader = 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)response.encoding = 'utf-8'with open('daili.html', 'wb') as fp:fp.write(response.content)#切换成原来的IPrequests.get(url, proxies={"http": ""})

转载于:https://www.cnblogs.com/mlhz/p/10462811.html

python爬虫之requests模块2相关推荐

  1. Python爬虫之Requests模块巩固深入案例

    爬虫之Requests模块巩固深入案例 requests实战之网页采集器 requests实战之破解百度翻译 requests实战之豆瓣电影爬取 requests实战之肯德基餐厅位置爬取 reques ...

  2. Python 爬虫二 requests模块

    requests模块 Requests模块 get方法请求 整体演示一下: import requestsresponse = requests.get("https://www.baidu ...

  3. 利用python爬虫(part4)--requests模块之requests.get方法

    学习笔记 文章目录 requests模块 requests常用方法 requests.get() requests模块 关于requests模块的安装 进入cmd,输入以下代码,即可安装: pip i ...

  4. 利用python爬虫(part13)--requests模块之requests.get的参数们

    学习笔记 requests.get()方法的参数们 查询参数params 语法 params = {'查询参数':'查询参数值'} res = requests.get(base_url,params ...

  5. Python爬虫的requests模块你真的学会了吗?来看看这些高级用法!

    1. 文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用它来实现,这非常简单,示例如下: 很多人学习python,不知道从何学起. 很多人学习python, ...

  6. python requests_Python爬虫之requests模块

    # requests模块 知识点: 掌握 headers参数的使用 掌握 发送带参数的请求 掌握 headers中携带cookie 掌握 cookies参数的使用 掌握 cookieJar的转换方法 ...

  7. 爬虫之requests模块发送post请求

    爬虫之requests模块发送post请求 思考:哪些地方我们会用到POST请求? 登录注册( 在web工程师看来POST 比 GET 更安全,url地址中不会暴露用户的账号密码等信息) 需要传输大文 ...

  8. 爬虫之requests模块发送带参数的请求

    爬虫之requests模块发送带参数的请求 我们在使用百度搜索的时候经常发现url地址中会有一个 ?,那么该问号后边的就是请求参数,又叫做查询字符串 1.1 在url携带参数 直接对含有参数的url发 ...

  9. 爬虫之requests模块介绍

    爬虫之requests模块介绍 requests文档http://docs.python-requests.org/zh_CN/latest/index.html      [文档中包括的快速上手要精 ...

最新文章

  1. python数据分析设置_Python 数据分析系列之如何安装和设置 Python
  2. swift集成alamofire的简单封装
  3. Android studio 使用心得(三)—从Eclipse迁移到Android studio
  4. SQL获取某个时间段的数据
  5. pyhon取文件md5值
  6. 搜狗输入法电脑版_搜狗输入法就是垃圾!!!大大的垃圾!
  7. 大学生换学校学计算机,高校换上新课桌,同学表示“世界观被颠覆”,网友:黑科技的诞生...
  8. xStream:Security framework of XStream not initialized, XStream is probably vulnerable.
  9. python自动化之djangoform表单验证
  10. 软件开发团队中,凭什么新手当道?| 畅言
  11. 最大公约数(超级好的板子)
  12. 【转】mysql数据库中实现内连接、左连接、右连接
  13. Mybatis批量新增
  14. Echarts数据可视化总结
  15. NLP(自然语言处理) - Tricks Dataset 集合
  16. win10计算机网络共享打不开,windows10系统打不开WiFi热点如何修复
  17. java模拟器ios版安装失败,iOS 在模拟器上安装 Debug 调试包(.app)
  18. A2-02-24.DML- Inserting Data into A Table Using MySQL INSERT Statement
  19. 《2018人工智能芯片技术白皮书》发布
  20. 专业建站和个人建站如何选择?

热门文章

  1. 删除Ubuntu旧内核的几种方法,这下grub菜单看起来清爽多了!
  2. 框架通讯契约——接口
  3. 《菜菜的机器学习sklearn课堂》学习笔记 + 课件
  4. SQLSERVER查询数据库所有表名及行数
  5. SQLSERVER根据字符 切割字符串的方法
  6. java操作oracle数据库 代码案例
  7. html页面锁屏,JavaScript网页锁屏效果源码实例
  8. 安装linux后win7引导程序,在Ubuntu系统下装Win7并引导双系统
  9. destoon php os,destoon运行流程二次开发必看
  10. matlab ct投影数据,CT_projection_and_reconstruction