代理操作

  • 代理的目的

    • 为解决ip被封的情况
  • 什么是代理
    • 代理服务器:fiddler
  • 为什么使用代理可以改变请求的ip
    • 本机的请求会先发送给代理服务器,代理服务器会接受本机发送过来的请求(当前请求对应的ip就是本机ip),然后代理服务器会将该请求进行转发,转发之后的请求对应的ip就是代理服务器的ip。
  • 提供免费代理的平台 
    • www.goubanjia.com
    • 快代理
    • 西祠代理
    • 代理精灵:http://http.zhiliandaili.cn
  • 代理ip的匿名度
    • 透明:使用了透明的代理ip,则对方服务器知道你当前发起的请求使用了代理服务器并且可以监测到你真实的ip
    • 匿名:知道你使用了代理服务器不知道你的真实ip
    • 高匿:不知道你使用了代理服务器也不知道你的真实ip
  • 代理ip的类型
    • http:该类型的代理IP只可以转发http协议的请求
    • https:只可以转发https协议的请求

 代理的测试

  

#代理测试
import requests
from lxml import etree
import random
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
#构建一个简易的ip池,字典形式的
proxy_list = [{'https':'212.64.51.13:8888'},{'https':'212.64.51.13:8888'},{'https':'212.64.51.13:8888'},
]
url = 'https://www.baidu.com/s?ie=UTF-8&wd=ip'
#proxies指定代理ip
page_text = requests.get(url=url,headers=headers,proxies=random.choice(proxy_list)).text
with open('ip.html','w',encoding='utf-8') as fp:fp.write(page_text)

如何构建一个标准的代理ip池

  • 1.取各大平台中爬取大量的免费代理ip
  • 2.校验出可用的代理ip
    • 使用每一个代理ip进行请求发送,监测响应状态码是否为200
  • 3.将可用的代理ip进行存储(redis)

爬取西祠 的代理ip

import requests
from lxml import etree
import random
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}all_ips = []# 从代理精灵上买去的代理ip
ip_url = 'http://ip.11jsq.com/index.php/api/entry?method=proxyServer.generate_api_url&packid=1&fa=0&fetch_key=&groupid=0&qty=53&time=1&pro=&city=&port=1&format=html&ss=5&css=&dt=1&specialTxt=3&specialJson='
page_text = requests.get(ip_url,headers=headers).text
tree = etree.HTML(page_text)
ip_list = tree.xpath('//body//text()')# 取出所有的代理ip并组成列表
for ip in ip_list:ip = {'https':ip}all_ips.append(ip)url = 'https://www.xicidaili.com/nn/%d'
for page in range(1,100):print('正在爬取第{}页的数据!'.format(page))new_url = format(url%page)page_text = requests.get(url=new_url,headers=headers,proxies=random.choice(all_ips)).texttree = etree.HTML(page_text)tr_list = tree.xpath('//*[@id="ip_list"]//tr')[1:]for tr in tr_list:ip = tr.xpath('./td[2]/text()')[0]port = tr.xpath('./td[3]/text()')[0]ip_type = tr.xpath('./td[6]/text()')[0]dic = {'ip':ip,'port':port,'type':ip_type}all_ips.append(dic)print(len(all_ips))  

cookie的操作

  • Cookie

    • 什么是cookie?

      • 保存在客户端的键值对
  • 爬取雪球网中的新闻数据:https://xueqiu.com/
#通过抓包工具捕获的基于ajax请求的数据包中提取的url
url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20343389&count=15&category=-1'
json_data = requests.get(url=url,headers=headers).json()
print(json_data){'error_description': '遇到错误,请刷新页面或者重新登录帐号后再试', 'error_uri': '/v4/statuses/public_timeline_by_category.json', 'error_data': None, 'error_code': '400016'}

cookie的破解方式

  • 手动处理:

    • 通过抓包工具将请求携带的cookie添加到headers中
    • 弊端:cookie会有有效时长,cookie还是动态变化
  • 自动处理:
    • 使用session进行cookie的自动保存和携带,代价有点大
    • session是可以进行请求发送的,发送请求的方式和requests一样
    • 如果使用session进行请求发送,在请求的过程中产生了cookie,则该cookie会被自动存储到session对象中
    • 如果使用了携带cookie的session再次进行请求发送,则该次请求就时携带cookie进行的请求发送
#创建一个session对象
session = requests.Session()
#将cookie保存到session对象中
first_url = 'https://xueqiu.com/'
session.get(url=first_url,headers=headers)#为了获取cookie且将cookie存储到session中

url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20343389&count=15&category=-1'
json_data = session.get(url=url,headers=headers).json()#携带cookie发起的请求
pprint(json_data)

验证码的识别

验证码的识别

  • 超级鹰:http://www.chaojiying.com/about.html

    • 使用流程:

      • 注册:用户中心身份的账号
      • 登陆:
        • 充值一块
        • 创建一个软件:软件ID-》生成一个软件ID
        • 下载示例代码:下载基于python的示例代码
  • 云打码:http://www.yundama.com/demo.html

下面代码使用云打码上下载的

import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

# 将文件进行报存

def getCodeImgText(imgPath,imgType):chaojiying = Chaojiying_Client('bobo328410948', 'bobo328410948', '899370')#用户中心>>软件ID 生成一个替换 96001im = open(imgPath, 'rb').read()#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//return chaojiying.PostPic(im,imgType)['pic_str']

#古诗文网的验证码识别操作
url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
page_text = requests.get(url,headers=headers).text
tree = etree.HTML(page_text)
img_src = 'https://so.gushiwen.org'+tree.xpath('//*[@id="imgCode"]/@src')[0]
print(img_src)
img_data = requests.get(url=img_src,headers=headers).content
with open('codeImg.jpg','wb') as fp:fp.write(img_data)
#进行验证码的识别
getCodeImgText('codeImg.jpg',1004)

模拟登陆

s = requests.Session()
#模拟登陆
#古诗文网的验证码识别操作
url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
page_text = s.get(url,headers=headers).text
tree = etree.HTML(page_text)
img_src = 'https://so.gushiwen.org'+tree.xpath('//*[@id="imgCode"]/@src')[0]
img_data = s.get(url=img_src,headers=headers).content
with open('codeImg.jpg','wb') as fp:fp.write(img_data)#解析动态变化的请求参数
__VIEWSTATE = tree.xpath('//input[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR = tree.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')[0]
print(__VIEWSTATE,__VIEWSTATEGENERATOR)
#进行验证码的识别
code_text = getCodeImgText('codeImg.jpg',1004)
print(code_text)
login_url = 'https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
data = {#下面两个请求参数是动态变化#通长情况下动态变化的请求参数会被隐藏在前台页面中'__VIEWSTATE': __VIEWSTATE,'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,'from': 'http://so.gushiwen.org/user/collect.aspx','email': 'www.zhangbowudi@qq.com','pwd': 'bobo328410948','code': code_text,'denglu': '登录',
}
#登陆成功之后对应的首页页面源码
main_page_text = s.post(url=login_url,headers=headers,data=data).text
with open('./main.html','w',encoding='utf-8') as fp:fp.write(main_page_text)

转载于:https://www.cnblogs.com/lulin9501/p/11303379.html

爬虫之代理和cookie的处理相关推荐

  1. python爬虫——使用代理和xpath爬取豆瓣读书

    根据豆瓣读书的所有标签自动创建文件夹,使用代理防止被反爬.但是我的代理好像是假的,还是被反爬了-通过设置cookie爬取,但是爬取一定数量后需要在浏览器手动进行验证码输入-总的来说,代码写的很麻烦 i ...

  2. python爬虫代理和selenium

    python爬虫代理和selenium 1.代理ip的使用 1.1 获取蘑菇代理中的代理ip def get_ip():response=requests.get('http://piping.mog ...

  3. 八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置 build_opener()初始化IP install_opener()将代理IP设置 ...

  4. Scrapy框架爬取我爱我家二手房信息存储CSV、mysql(IP代理和User-Agent用户代理)

    有一段时间没出来活动了闲来无事弄个玩玩O(∩_∩)O哈哈~ 想必学过Scrapy框架的人都知道如何创建Scrapy和运行,那么我这里呢现将我创的框架展示一下 scrapy startproject p ...

  5. ip模拟工具_HTTP代理和IP代理有什么区别

    在我们互联网工作者当中,HTTP代理和IP代理相信都不陌生.因为在大家工作的时候,一些特定的领域或者功能需要通过代理软件来完成.虽然这个软件不是一定要使用,可是一旦不用不仅会让工作效率变低,爬虫工作者 ...

  6. Day3_代理和css解析

    Day3_代理和css解析 获取代理 找到购买代理网站,推荐蘑菇代理. 根据api获取ip地址,然后用新的ip地址给proxies赋值 def get_proxy_ips():api = 'http: ...

  7. JDK动态代理和Cglib的动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需 ...

  8. AspectJ和Spring AOP(java动态代理和CGLIB)简单介绍

    1.AOP介绍 什么是AOP:AOP就是面向切面编程.使用的背景: 1)我们的振隆维护着一千个方法,一天老板让振隆把这一千个方法都要加上事务代码(统一代码) 2)振隆咬咬牙,添加了一个新的方法,然后让 ...

  9. python爬虫 - Urllib库及cookie的使用

    lz提示一点,python3中urllib包括了py2中的urllib+urllib2.[python2和python3的区别.转换及共存 - urllib] 怎样扒网页? 其实就是根据URL来获取它 ...

  10. jdk动态代理和cglib动态代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

最新文章

  1. Nature综述:菌根共生的独特性和共性
  2. python调用c++返回带成员指针的类指针
  3. vscode remote ssh 远程开发免密登陆方法
  4. 【论文串讲】从BERT和XLNet到MPNet
  5. python的ctypes模块详解数组_如何使用Python的ctypes和readinto读取包含数组的结构?...
  6. 合并m3u8(ts)文件的工具
  7. 智慧校园物联网管理平台建设方案2.0
  8. xp系统支持64g内存_让WindowsXP SP3支持64G内存,继续发回余热
  9. Jenkins-构建项目
  10. 北京航空航天大学计算机学院保研,北京航空航天大学计算机学院(专业学位)计算机技术保研...
  11. C#时间格式转换为时间戳
  12. 【概率论】- (2)假设检验
  13. ajax、promise、react、缓存笔记记录
  14. Pytorch函数之topk()方法
  15. 似然函数的详细分析----似然函数的本质意义
  16. 网易云课堂微专业--Java高级开发工程师
  17. 如何通俗的解释全微分
  18. 2020 java Mybatis 面试题及答案(最全版本持续更新)
  19. jzxx1099 2的100次方
  20. 深入了解css中的grid布局

热门文章

  1. jsp乱码介绍(续)
  2. Linux/Unix/Mac OS下的远程访问和文件共享方式
  3. linux jvm启动过程,Linux操作系统启动过程详解
  4. Linux环境下gcc静态编译/usr/bin/ld: cannot find -lc错误原因及解决方法。
  5. android对象识别实验报告,20162302 实验四《Android程序设计》实验报告
  6. php 创建 cookie文件,php创建、获取cookie及基础要点分析
  7. Redis 6.0 源码阅读笔记(2) -- Redis 多线程原理
  8. Linux系统编程 -- IO缓冲区
  9. Linux系统编程 -- 线程池操作
  10. 【渝粤教育】国家开放大学2018年春季 0001-21T入学教育与终身学习指引 参考试题