4 中文乱码 selenium的使用
# 中文乱码
#处理中文乱码
import requests
from lxml import etree
from urllib import request
url = 'http://pic.netbian.com/4kqiche/'
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'
}
response = requests.get(url=url,headers=headers) #响应
#手动设置响应数据的编码
# response.encoding = 'utf-8'
page_text = response.text
tree = etree.HTML(page_text) #实例化
li_list = tree.xpath('//div[@class="slist"]/ul/li')
for li in li_list:
img_src = li.xpath('./a/img/@src')[0]
img_name = li.xpath('./a/b/text()')[0]
# 通用性
img_name = img_name.encode('iso-8859-1').decode('gbk') #西欧 向下兼容ascii 一般浏览器默认的文本编码格式
request.urlretrieve(url="http://pic.netbian.com"+img_src,filename='./图片/%s.jpg'%img_name) #相对路径
# request.urlretrieve(url="http://pic.netbian.com"+img_src,filename=r'C:\spider\day01\图片\%s.jpg'%img_name) #绝对路径
print(img_name,'0k')
print('OK')
连接池报警 请求头改 Connection: keep-alive 为close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
代理IP 在IP被封禁后
每次请求之间sleep进行间隔等待
模拟登陆 -- 爬取基于某些用户的用户信息
验证码识别:云打码平台 http://www.yundama.com/ 打码兔 超级鹰
使用流程:
注册
登陆:
普通用户:
查询剩余提分(充值) http://www.yundama.com/price.html
开发者用户:
创建软件:我的软件-》添加新软件(ID,秘钥)
下载示例代码:开发文档-》点此下载:云打码接口DLL-》PythonHTTP示例下载
代理:代理服务器
- 快代理
- 西祠代理
- goubanjia
匿名度:
透明:对方服务器知道你使用了代理ip也知道你的真实ip
匿名:知道你使用了代理ip但是不知道你的真实ip
高匿:什么都不知道
类型:
http:只可以发起http请求
https:只可以发起https的请求
# 代理池
import requests
url = 'http://www.baidu.com/s?wd=ip'
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'
}
page_text = requests.get(url=url,headers=headers,proxies={'http':'117.127.0.202:80'}).text
with open('./ip.html','w',encoding='utf-8') as fp:
fp.write(page_text)
# 构建代理池
http_list = [
{'http':'60.190.250.120:8080'},
{'http':'60.190.250.120:8080'},
{'http':'60.190.250.120:8080'}
]
https_list = [
{'https':'60.190.250.120:8080'},
{'https':'60.190.250.120:8080'},
{'https':'60.190.250.120:8080'}
]
# selenium 自动化
# 用来完成浏览器自动化相关的操作,可以通过代码的形式制定一些基于浏览器自动化的(行为动作),当代码执行后,浏览器就会自动触发定义的事件.
- 环境安装:
pip install selenium
下载对应浏览器的驱动软件
http://chromedriver.storage.googleapis.com/index.html
查看驱动和浏览器版本的映射关系:
http://blog.csdn.net/huilan_same/article/details/51896672
- 编码流程:
- 导包
- 实例化某一款浏览器对象
- 制定相关行为动作
Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。
PhantomJS 现在停止维护更新了,不建议使用,在无界面领域,建议google的chrome无头.
https://www.cnblogs.com/bobo-zhang/p/9685362.html 更多请浏览这个link
# 简单的百度自动化处理 chromedriver.exe是个软件
from selenium import webdriver # web驱动 显式的自动化浏览器操作
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.baidu.com')
sleep(2)
# 标签定位
tag_input = bro.find_element_by_id('kw')
tag_input.send_keys('人民币') btn = bro.find_element_by_id('su')
btn.click()
sleep(2) bro.quit() # 退出
from selenium import webdriver # 显式的Js滚轮操作
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://xueqiu.com')
sleep(5)
# 执行js实现滚轮向下滑动
js = "window.scrollTo(0,document.body.scrollHeight)"
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
bro.execute_script(js)
sleep(2)
# 加载更多的处理
a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a')
a_tag.click()
sleep(5)
# 获取当前浏览器页面数据(动态数据)
bro.page_source # 可print bro.quit() # 退出
# 一款无可视化的浏览器(免安装) 基于谷歌无头
# 谷歌无头浏览器
from selenium import webdriver
from time import sleep
from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options)
bro.get('https://www.baidu.com')
sleep(2)
bro.save_screenshot('1.png') #拍照截屏
#标签定位
tag_input = bro.find_element_by_id('kw')
tag_input.send_keys('人民币')
sleep(2) btn = bro.find_element_by_id('su') # 找见 百度一下 按钮
btn.click() # 点击进行搜索
sleep(2) print(bro.page_source) # 打印页面资源
bro.quit() #退出
# 前进后退
# 模拟浏览器 前进 后退
from time import sleep
from selenium import webdriver bro=webdriver.Chrome(executable_path='./chromedriver.exe')
bro.get('https://www.baidu.com')
sleep(1)
bro.get('https://www.taobao.com')
sleep(1)
bro.get('https://sogou.com')
sleep(1) browser.back() #后退
sleep(1)
browser.forward() #前进
print(bro.page_source)
sleep(1)
bro.close()
# 动作链 拖动 点击
#动作链
from selenium import webdriver
from time import sleep
from selenium.webdriver import ChromeOptions
from selenium.webdriver import ActionChains #动作链的类 option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
bro.get(url=url)
#如果定位的标签存在于iframe标签之中,则必须经过switch_to(切换参照物)操作在进行标签定位 页面加载的子页面
bro.switch_to.frame('iframeResult') # frame的id
source_tag = bro.find_element_by_id('draggable') # 开始地
taget_tag = bro.find_element_by_id('droppable') # 目的地
#创建一个动作链的对象
action = ActionChains(bro) #实例化动作链对象 传入浏览器对象
action.drag_and_drop(source_tag,taget_tag)
action.perform() #执行
sleep(3)
# bro.quit() # 退出
# 动作链 简单版
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
bro.get(url=url)
#如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
bro.switch_to.frame('iframeResult')
source_tag = bro.find_element_by_id('draggable')
#创建一个动作连的对象
action = ActionChains(bro)
action.click_and_hold(source_tag) for i in range(4):
#perform表示开始执行动作链
action.move_by_offset(20,0).perform() #x,y 水平/垂直像素
sleep(1)
bro.quit()
# 如何规避selenium被检测到?
正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为 undefined。
而使用selenium访问则该值为true. 只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,
它的值为['enable-automation'],完整代码如下:
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
# QQ空间的模拟登录
# 只在没有验证码情况下适用 QQ空间模拟登陆
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
url = 'https://qzone.qq.com'
bro.get(url=url)
#如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
bro.switch_to.frame('login_frame')
input_tag = bro.find_element_by_id('switcher_plogin').click()
bro.find_element_by_id('u').send_keys('') #这里填写你的QQ号
bro.find_element_by_id('p').send_keys('') #这里填写你的QQ号
bro.find_element_by_id('login_button').click()
sleep(3)
print(bro.page_source)
bro.save_screenshot('zone.png') # 截屏 拍照
bro.quit()
# QQ空间模拟
from selenium import webdriver
from time import sleep
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
url = 'https://qzone.qq.com'
bro.get(url=url)
#如果定位的标签存在于iframe标签之中,则必须经过switch_to操作在进行标签定位
bro.switch_to.frame('login_frame')
avartar_tag = bro.find_element_by_id('img_out_576951284').click()
sleep(3)
print(bro.page_source)
bro.save_screenshot('zone.png')
bro.quit()
4 中文乱码 selenium的使用的更多相关文章
- RoportNG报表显示中文乱码和TestNG显示中文乱码实力解决办法
最近在进军测试自动化框架学习阶段,但无意间总是会伴随小问题的困扰,比如中文乱码,而导致显示总是不舒服,个人觉得,就一定要解决,似乎有点点强迫症.所以遇到RoportNG报表显示中文乱码和TestNG显 ...
- HTMLTestRunner测试报告中文乱码问题解决
在学习python selenium自动化测试学习中遇到HTMLTestRunner测试报告出现乱码的问题 Test Group/Test case Count Pass Fail Error Vie ...
- ReportNG报表显示中文乱码和TestNG显示中文乱码实力解决办法
最近在进军测试自动化框架学习阶段,但无意间总是会伴随小问题的困扰,比如中文乱码,而导致显示总是不舒服,个人觉得,就一定要解决,似乎有点点强迫症.所以遇到ReportNG报表显示中文乱码和TestNG显 ...
- java中文乱码解决之道(一)-----认识字符集
沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...
- MAC下 mysql不能插入中文和中文乱码的问题总结
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
- java中文乱码解决之道(九)-----总结
乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...
- 解决springmvc+mybatis+mysql中文乱码问题【转】
这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...
- freemarker页面中文乱码
一.前言 简单的记录freemarker遇到的错误问题:ftl页面中文乱码 由于freemarker整合在ssm框架中,所以笔者直接贴配置代码 <beans xmlns="http:/ ...
- tomcat项目中文乱码问题解决方法
在部署tomcat项目时经常会遇到中文乱码问题,解决的方法可参考以下步骤. 1.更改Tomcat安装目录下的conf\server.xml,指定浏览器的编码格式为"utf-8"格式 ...
随机推荐
- 第一个Mybatis项目
第一个Mybatis项目 一.创建普通Maven项目 1.配置pom.xml文件 <dependencies> <!--mysql驱动--> <dependency> ...
- 2.7.5 元素定位(主推xpath、cssSelector) ❀❀❀
定位方式选择: 1. 当页面元素有id属性时,最好尽量用id来定位.但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法. 2. xpath很强悍,但定位性能 ...
- 19年7月份面试7家公司,整理的java面试题(答案自行百度解决,也是个学习的过程)
Dubbo与注册中心Zookeeper了解多少ConcurrentHashMap的原理 集合 HashMap 和 HashTable和ConcurrentHashMap的原理以及区别HashMap初始 ...
- 题解【洛谷P2341】 [HAOI2006]受欢迎的牛
题面 题解 \(Tarjan\)缩点后统计每个点的出度. 如果有多个点出度为\(0\),就直接输出\(0\),否则输出出度为\(0\)的强连通分量里的点数. 代码 #include <iostr ...
- [lua]紫猫lua教程-命令宝典-L1-01-10. 自定义函数
L1[function]01. 定义与调用函数 函数的定义 和概念 没什么可说的 lua的函数声明和调用是有先后顺序的 先声明后调用 函数就是变量的一种 所以可以自由的把函数在变量间相互赋值 不过注 ...
- winform学习(4)控件的添加、显示和隐藏
窗体的添加.显示与隐藏 可以直接通过工具栏将某个控件直接拖动至UI界面(也可以在工具栏里双击某个控件) 也可以在代码里直接添加:窗体的标识.Controls.Add(控件标识符); Button my ...
- STA之RC Corner再论
Q:RC-Corner跟PVT怎么组合? A:通常的组合: Q:通常说的ttcorner指的是啥? A:@孟时光 ttcorner是指管子在tt+RCtyp吧. Typesof corners W ...
- Vue-cli3 项目配置 Vue.config.js( 代替vue-cli2 build config)
Vue-cli3 搭建的项目 界面相对之前较为简洁 之前的build和config文件夹不见了,那么应该如何配置 如webpack等的配那 只需要在项目的根目录下新建 vue.config.js 文件 ...
- Jarvis OJ - 软件密码破解-1 -Writeup
Jarvis OJ - 软件密码破解-1 -Writeup 转载请标明出处http://www.cnblogs.com/WangAoBo/p/7243801.html 记录这道题主要是想记录一下动态调 ...
- NIO-BufferAPI
一 核心要素 capacity (容量):不能为负,不可更改:就是buffer的长度(buffer.length) limit (限制):指第一个不可被读入缓冲区元素的位置:不可为负,若positio ...