20200226 请求库selenium
昨日回顾
以后如果写爬虫相关的简历:爬取拉钩的职位信息,爬取XX小视频,模拟XX登录,爬取天气信息,爬取糗事百科:只看不发掉人品(网络原因,没有那么快,没有抓住移动互联网机遇,一直没有转型,文字,图片,视频),内涵段子:段友是一家,被国家干掉了
脉脉(职场人脉交流,投简历,职场吐槽),无秘(匿名吐槽平台),软件---》多少注册用户(100百块一个人)---》拉投资
自己做点小东西赚钱:自己写了一个类似于微信漂流瓶的app,非常多的用户,靠在app中加广告
实际在公司公司,爬虫爬什么?一定是有实际用途
-(违法)儿童英语培训的网站,培训网站注册用户的手机号(父母,账号就是手机号,给父母打电话,推销商品)(个人信息,一块钱一条)个人信息太详细
-爬取一些政府网站(商标,药监局,化妆品)
-爬取好大夫医生信息(医生喜欢开什么处方药),药厂,推他们的药
-天眼查(企业信息)
-爬简历(简历库做分析,数据分析公司)
-爬股票信息(公司财务信息)
## 1 bs4
```python
1 网页解析(html、xml)
2 把网页信息(字符串),构造成一个soup对象
3 遍历文档树(从上往下 通过 . 的方式)速度快,只能找到最近的一个
4 查找文档 (全局取搜)find find_all 返回的对象可以继续查找(tag对象)
-中方式(字符串,列表,正则,布尔,方法)
-find(class_='ddd')
-find(attrs={'class':'ddd'})
5 获取属性 (tag['属性名'] tag.attrs.get('属性名'))
6 拿文本 tag.text tag.string tag.strings
7 css选择器 . # >和空格的区别,如果忘了,去网上查着写
8 limit和递归
9 修改文档树的(有一些配置文件用的是xml格式,可以用它来修改)
```
## 2 代理池
```python
1 收费的代理(怎么收费的?)
2 免费的
-自己爬的(爬回100条,99条不能用),定时测试能不能用,定时任务,用代理去访问一个网址(定时任务的框架)
-网上开源的代理池(咱们干的事,都帮咱干了)
```
## 3 打码平台
```python
-简单验证码,其实是可以用程序识别的(数组,字母),识别率很低
-打码平台:收费的,只需要用人家接口,把图片传上去,就能识别成功
```
## 补充:python调用dll文件执行
跟华为合作,华为摄像头的硬件设备,windows,用软件
用python来调用,可以操控摄像头,给了他们一个文档(熟悉一门桌面开发语言第三方库,Tkinter,pyqt),
华为提供了sdk(别人帮咱写好的底包),只需要用python来调用,华为提供的不是用python写的sdk,
xxx.dll这种东西,动态链接库,c语言写的,(windows中每个软件都会有dll文件)
dll文件是用c语言写的(exe,dll:add,remove)
ret=对象.add( )
xpath选择器
xpath: xml查找语言 ,在xml中查找标签的语言
# /从节点中选取和
使用
安装
pip install lxml
使用
from lxml import etree
1.实例化
# 实例化的第一种方式(字符串)
html=etree.HTML(doc)
# 第二种方式(文件)
html=etree.parse('search.html',etree.HTMLParser())
xpath常用规则
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从当前节点选区直接子节点 |
// | 从当前节点选取子孙节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
这里列出了 XPath 的常用匹配规则,示例如下:
//title[@lang='eng']
这是一个 XPath 规则,代表的是选择所有名称为 title,同时属性 lang 的值为eng
的节点,后面会通过 Python 的 lxml 库,利用 XPath 进行 HTML 的解析。
#xpath:xml查找语言,在xml中查找标签的语言
基本使用
# 基本使用 (****重点,xpath选择出来的结果都是列表)
ret=html.xpath('//body/div/a')
# 获取属性 @
ret=html.xpath('//body/div/a/@href')
# 获取文本 text()
ret=html.xpath('//body/div/a/text()')
详细使用
# 1.获取所有的标签
a=html.xpath('//*')
# 2 指定节点(结果为列表)
a=html.xpath('//head')
# 3 子节点,子孙节点
a=html.xpath('//div/a')
a=html.xpath('//body/a') #无数据
a=html.xpath('//body//a')
# 4 父节点
a[@href="image1.html"] 找a标签,a标签的href属性是image1.html
find(name='a',href='image1.html')
a=html.xpath('//body//a[@href="image1.html"]/..')
a[1] body下的第一个a
a=html.xpath('//body//a[1]/..')
也可以这样(了解)
a=html.xpath('//body//a[1]/parent::*')
# 5 属性匹配
a=html.xpath('//body//a[@href="image2.html"]/text()')
a=html.xpath('//body//a[@href="image2.html"]')
# 6 文本获取
a=html.xpath('//body//a[@href="image1.html"]/text()')
#7 属性获取
a=html.xpath('//body//a/@href')
# 注意从1 开始取(不是从0)
a=html.xpath('//body//a[1]/@href')
选最后一个
a=html.xpath('//body//a[last()]/@href')
# 8 属性多值匹配
a 标签有多个class类,直接匹配就不可以了,需要用contains
a=html.xpath('//body//a[@class="li"]')
a=html.xpath('//body//a[contains(@class,"li")]')
a=html.xpath('//body//a[contains(@class,"li")]/text()')
# 9 多属性匹配
a=html.xpath('//body//a[contains(@class,"li") or @name="items"]')
a=html.xpath('//body//a[contains(@class,"li") or @name="items"]/text()')
a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')
a=html.xpath('//body//a[contains(@class,"li")]/text()')
#10 按序选择
a=html.xpath('//a[2]/text()')
a=html.xpath('//a[2]/@href')
取最后一个
a=html.xpath('//a[last()]/@href')
位置小于3的
a=html.xpath('//a[position()<3]/@href')
倒数第二个
a=html.xpath('//a[last()-2]/@href')
# 11 节点轴选择
ancestor:祖先节点
使用了* 获取所有祖先节点
a=html.xpath('//a/ancestor::*')
# 获取祖先节点中的div
a=html.xpath('//a/ancestor::div')
attribute:属性值
a=html.xpath('//a[1]/attribute::*')
child:直接子节点
a=html.xpath('//a[1]/child::*')
descendant:所有子孙节点
a=html.xpath('//a[6]/descendant::*')
following:当前节点之后所有节点
a=html.xpath('//a[1]/following::*')
a=html.xpath('//a[1]/following::*[1]/@href')
following-sibling:当前节点之后同级节点
a=html.xpath('//a[1]/following-sibling::*')
a=html.xpath('//a[1]/following-sibling::a')
a=html.xpath('//a[1]/following-sibling::*[2]/text()')
a=html.xpath('//a[1]/following-sibling::*[2]/@href')
print(a)
//*[@id="key"]
//*[@id="settleup"]/div[1]
/html/body/div[1]/div[4]/div/div[2]/div/div[3]/div[1]
#settleup > div.cw-icon
css选择器和xpath选择器都可以直接copy(html网页中)
XPath 运算符
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
or | 或 | age=18 or age=20 | age=18:True;age=21:False |
and | 与 | age>18 and age<21 | age=20:True;age=21:False |
mod | 计算除法的余数 | 5 mod 2 | 1 |
| | 计算两个节点集 | //book | //cd | 返回所有拥有 book 和 cd 元素的节点集 |
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | age=19 | 判断简单,不再赘述 |
!= | 不等于 | age!=19 | 判断简单,不再赘述 |
< | 小于 | age<19 | 判断简单,不再赘述 |
<= | 小于等于 | age<=19 | 判断简单,不再赘述 |
> | 大于 | age>19 | 判断简单,不再赘述 |
>= | 大于等于 | age>=19 | 判断简单,不再赘述 |
请求库selenium
简介
是一个自动化测试模块: 控制浏览器像人一样操作
selenium除了可以自动化测试,还可以做爬虫selenium可以帮我们打开浏览器,向目标网站发送请求,获取响应数据
控制浏览器,像人一样操作,用在爬虫中(为什么会用在爬虫中),执行js
使用(本质,并不是python在操作浏览器,而是python在操作浏览器驱动(xx.exe),浏览器驱动来驱动浏览器)
selenium请求库
- 优点:
不需要详细分析网站的请求流程
可以帮我们做绕过登录华东认证
通过python代码执行js代码
- 缺点
爬虫效率低
requests请求库
- 优点
模拟浏览器,获取一个user-agent即可,无需等待css/js等文件的加载
- 缺点
每个网站都需要详细分析请求流程,分析时间非常耗时
安装
1.安装模块
pip install selenium
2.下载相应浏览器的驱动器
使用谷歌浏览器的驱动(对应谷歌浏览器)
下载
http://npm.taobao.org/mirrors/chromedriver/
对应浏览器版本的驱动
选择win版本,下载解压即可
查找方法
查找元素
这里列举一下常用的查找元素方法:
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
下面这种方式是比较通用的一种方式:这里需要记住By模块所以需要导入
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
url = 'https://www.taobao.com'
browser.get(url)
input_1 = browser.find_element(By.ID, 'q')
print(input_1)
当然这种方法和上述的方式是通用的,browser.find_element(By.ID,"q")
这里By.ID中的ID可以替换为其他几个
我个人比较倾向于css
单个元素查找
from selenium import webdriver#导入库
browser = webdriver.Chrome()#声明浏览器
url = 'https:www.taobao.com'
browser.get(url)#打开浏览器预设网址
input_first = browser.find_element_by_id('q')
input_two = browser.find_element_by_css_selector('#q')
print(input_first)
print(input_two)
这里我们通过2种不同的方式去获取响应的元素,第一种是通过id的方式,第二个中是CSS选择器,结果都是相同的。
输出如下:
<selenium.webdriver.remote.webelement.WebElement (session="9aaa01da6545ba2013cc432bcb9abfda", element="0.5325244323105505-1")>
<selenium.webdriver.remote.webelement.WebElement (session="9aaa01da6545ba2013cc432bcb9abfda", element="0.5325244323105505-1")>
多个元素查找
其实多个元素和单个元素的区别,举个例子:find_elements
,单个元素是find_element
,其他使用上没什么区别,通过其中的一个例子演示:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.taobao.com'
browser.get(url)
input = browser.find_elements_by_css_selector('.service-bd li')
print(input)
browser.close()
输出为一个列表形式:
[<selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-1")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-2")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-3")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-4")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-5")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-6")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-7")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-8")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-9")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-10")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-11")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-12")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-13")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-14")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-15")>, <selenium.webdriver.remote.webelement.WebElement (session="42d192ca36f75170ab489e4839df0980", element="0.73211490098068-16")>]
当然上面的方式也是可以通过导入from selenium.webdriver.common.by import By
这种方式实现
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在:
find_elements_by_name
find_elements_by_id
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
元素交互操作
对于获取的元素调用交互方法
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get(url='https://www.baidu.com')
time.sleep(2)
input = browser.find_element_by_css_selector('#kw')
input.send_keys('韩国女团')
time.sleep(2)
input.clear()
input.send_keys('后背摇')
button = browser.find_element_by_css_selector('#su')
button.click()
time.sleep(10)
browser.close()
运行的结果可以看出程序会自动打开Chrome浏览器并打开百度页面输入韩国女团,然后删除,重新输入后背摇,并点击搜索
Selenium所有的api文档:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
交互动作
将动作附加到动作链中串行执行
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
更多操作参考:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
执行JavaScript
这是一个非常有用的方法,这里就可以直接调用js方法来实现一些操作,
下面的例子是通过登录知乎然后通过js翻到页面底部,并弹框提示
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
获取元素属性
get_attribute('class')
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
logo = browser.find_element_by_css_selector('.zu-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
print(logo.get_attribute('id'))
time.sleep(2)
browser.quit()
输出如下:
<selenium.webdriver.remote.webelement.WebElement (session="b72dbd6906debbca7d0b49ab6e064d92", element="0.511689875475734-1")>
zu-top-link-logo
zh-top-link-logo
获取文本值
text
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
logo = browser.find_element_by_css_selector('.zu-top-link-logo')
print(logo)
print(logo.text)
输出如下:
<selenium.webdriver.remote.webelement.WebElement (session="ce8814d69f8e1291c88ce6f76b6050a2", element="0.9868611170776878-1")>
知乎
获取ID,位置,标签名
id location tag_name size
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_css_selector('.zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
输出如下:
0.022998219885927318-1
{'x': 759, 'y': 7}
button
{'height': 32, 'width': 66}
基础使用
将.exe驱动放入python安装文件夹中的script文件夹内,即可便捷使用
1 实例化
bro=webdriver.Chrome(executable_path='./chromedriver')
2 发送请求
bro.get('https://www.baidu.com/')
3 打印加载完成的(js执行完成)html,
browser.execute_script('window.open()')
4 找控件(自己的一堆方法,css,xpath)
find_....
5 向控件中写数据
send_keys('')
6 点击控件
.click
7 清空控件
.clear
8 显式等待和隐式等待(都用隐士:bro.implicitly_wait(10))
.implicitly_wait(2)
9 获取cookie
bro.get_cookies()
10 关闭
.close()
11 补充:
find_elements_xxx和find_element_xx 一个是找所有,一个是找到第一个
-其他操作
-模拟浏览器前进后退 bro.back() bro.forword()
-选项卡管理,用的是执行js
print(browser.window_handles) #获取所有的选项卡
无界面浏览器
会隐藏浏览器(只有谷歌)
#selenium:3.12.0
#webdriver:2.38
#chrome.exe: 65.0.3325.181(正式版本) (32 位)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" #手动指定使用的浏览器位置
driver=webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.baidu.com')
print('hao123' in driver.page_source)
driver.close() #切记关闭浏览器,回收资源
selenium+谷歌浏览器headless模式
动作链
#使用动作链
# 使用动作链
#1 得到一个动作练对象
action=ActionChains(bro)
# 使用动作链
#2 点击并且夯住
action.click_and_hold(div)
#3 移动x坐标,y坐标
for i in range(5):
action.move_by_offset(10,10)
# 直接把上面的div移动到某个元素上
# action.move_to_element(元素控件)
# 直接把上面的div移动到某个元素上的某个位置
# action.move_to_element_with_offset()
#4 调用它,会动起来
action.perform()
time.sleep(1)
#5 释放动作链
action.release()
案例
爬取煎蛋网
# 1.导入模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 操作键盘
import time
# 2.获取webdriver对象
# 这里默认的驱动位置executable_path="chromedriver"所以直接将驱动放入python安装文件夹script中即可
driver = webdriver.Chrome()
# 3.使用
try:
# 1.发送请求
driver.get('https://jandan.net/top-ooxx')
# 2.隐式等待
driver.implicitly_wait(2)
# 3.模拟滚轮
js_code = '''
window.scrollTo(0,10000)
'''
# execute_script该方法可以执行js代码
driver.execute_script(js_code)
# 等待加载
time.sleep(2)
# 4.获取数据
# 获取ol下的所有li标签
comment_list = driver.find_elements_by_css_selector('.commentlist>li')
for comment in comment_list:
# 用户名
comment_name = comment.find_element_by_css_selector('.author strong').text
# print(comment_name)
# id
comment_id = comment.get_attribute('id')
# print(comment_id)
# 图片
comment_img = comment.find_element_by_css_selector('.text p a')
img_url = comment_img.get_attribute('href')
# print(img_url)
# 保存数据
ret = requests.get(img_url)
with open(f'{comment_id}.jpg','wb') as f:
f.write(ret.content)
print(f'用户{comment_name}上传的{comment_id}照片下载完毕')
# 喜欢OO
comment_oo = comment.find_element_by_css_selector('.jandan-vote span').text
# print(comment_oo)
time.sleep(2)
finally:
# 关闭webdriver
driver.close()
'''爬取煎蛋网'''
爬取京东
#爬取京东商品链接,名称,价格,评论数,图片
#爬取京东商品信息
#-*- coding: utf-8 -*-
#!/usr/bin/env python3
' a test 爬取京东数据 '
__author__ = 'Fwzzz'
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import requests
def key_input(kw):
# 搜索框执行
input_tag = drive.find_element_by_id('key')
input_tag.send_keys(kw)
input_tag.send_keys(Keys.ENTER)
def get_goods(drive):
# 获取所有的li标签
li_tag_list = drive.find_elements_by_class_name('gl-item')
for li_tag in li_tag_list:
# 商品名
title = li_tag.find_element_by_css_selector('.p-name em').text
print(title)
# 商品图片
img_url = li_tag.find_element_by_css_selector('.p-img img').get_attribute('src')
# 根据标签进行查找(页面属性不同)
if not img_url:
# print(111111,li_tag.find_element_by_css_selector('.p-img img').get_attribute('data-lazy-img'))
img_url = f"https:{li_tag.find_element_by_css_selector('.p-img img').get_attribute('data-lazy-img')}"
print(img_url)
# 保存数据
save_img(img_url,title)
# 价格
price = li_tag.find_element_by_css_selector('.p-price i').text
# 评价
commit = li_tag.find_element_by_css_selector('.p-commit a').text
# 爬完第一页继续获取
next_tag = drive.find_element_by_partial_link_text('下一页')
time.sleep(1)
next_tag.click()
# 继续执行 递归
get_goods(drive)
# 保存数据
def save_img(img_url,title):
ret = requests.get(img_url)
with open(f'{title}.jpg','wb') as f:
f.write(ret.content)
print(f'{title}.jpg下载完毕')
if __name__ == '__main__':
# 实例化
drive = webdriver.Chrome()
# 访问网站
drive.get('https://www.jd.com/')
# 隐形等待
drive.implicitly_wait(3)
# 运行搜索框输入关键字
kw = '变形金刚'
key_input(kw)
try:
# 执行爬取
get_goods(drive)
time.sleep(10)
except Exception as e:
print(e)
finally:
drive.close()
自动登录12306
# 自动登录12306
# pip3 install pillow
from PIL import Image
from chaojiying import Chaojiying_Client
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
import json
import requests
bro =webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://kyfw.12306.cn/otn/login/init')
bro.implicitly_wait(10)
# 因为selenium没有直接截取某个元素的功能,现在需要截取全图,然后通过图形软件,再把小图扣出来
# bro.minimize_window() #最小化
# bro.maximize_window() #最大化
# save_screenshot 截取整个屏幕
bro.save_screenshot('main.png')
tag_code =bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
# 查看控件的位置和大小
size =tag_code.size
location =tag_code.location
print(size)
print(location)
img_tu = (int(location['x']) ,int(location['y']) ,int(location['x' ] +size['width']) ,int(location['y' ] +size['height']))
# # 抠出验证码
# #打开
img =Image.open('./main.png')
# 抠图
fram =img.crop(img_tu)
# 截出来的小图
fram.save('code.png')
# 调用超级鹰,破解
def get_result():
chaojiying = Chaojiying_Client('306334678', 'lqz123', '903641') # 用户中心>>软件ID 生成一个替换 96001
im = open('code.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 9004)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
return chaojiying.PostPic(im, 9004)['pic_str']
# 返回结果如果有多个 260,133|123,233,处理这种格式[[260,133],[123,233]]
result=get_result()
all_list=[]
if '|' in result:
list_1 = result.split('|')
count_1 = len(list_1)
for i in range(count_1):
xy_list = []
x = int(list_1[i].split(',')[0])
y = int(list_1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
else:
x = int(result.split(',')[0])
y = int(result.split(',')[1])
xy_list = []
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
print(all_list)
# 用动作链,点击图片
# [[260,133],[123,233]]
for a in all_list:
x = a[0]
y = a[1]
ActionChains(bro).move_to_element_with_offset(tag_code, x, y).click().perform()
time.sleep(1)
username=bro.find_element_by_id('username')
username.send_keys("你自己的账号")
pwd=bro.find_element_by_id('password')
pwd.send_keys('你自己的密码')
submit=bro.find_element_by_id('loginSub')
submit.click()
#获取cookie
# 使用requests模块,携带cookie朝某个接口发请求
c = bro.get_cookies()
print(c)
with open('xxx.json', 'w') as f:
json.dump(c, f)
cookies = {}
# 获取cookie中的name和value,转化成requests可以使用的形式
# for cookie in c:
# cookies[cookie['name']] = cookie['value']
#
# print(cookies)
with open('xxx.json', 'r') as f:
di = json.load(f)
cookies = {}
# 获取cookie中的name和value,转化成requests可以使用的形式
for cookie in di:
cookies[cookie['name']] = cookie['value']
print('---------')
print(cookies)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
'Referer': 'https: // kyfw.12306.cn /otn/view/index.html',
'Origin': 'https://kyfw.12306.cn',
'Host': 'kyfw.12306.cn',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
}
res = requests.post('https://kyfw.12306.cn/otn/index/initMy12306Api',headers=headers,
cookies=cookies)
print(res.text)
cookie池讲解
# 通过selenium登录,获取cookie,放到redis中,用flask框架搭建服务,每发一次请求,获取一个cookie
dic={'lqz':'xxx','egon':'eee','json':'ttt'}
fiddler抓包工具
# 抓包工具的使用(fiddler,charles)
# # 6 fildder的使用:http://101.133.225.166:8088/
#下载地址:https://www.telerik.com/fiddler
# https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe
# 双击安装,一路下一步
# 桌面上绿色的东西
# 双击打开(中文汉化版)
# 这个东西可以抓手机包,手机app都是http请求,手机端配置代理(装有fildder的机器地址)
手机跟电脑连到同一个路由器,手机端配置代理是你的机器 网关
补充
通过加密 把body体中所有内容加一下密,响应体中的数据
apk的软件包,用压缩软件直接解压 xx.jar文件,把jar文件反编译成java,你就可以读代码,看到加密算法
360加固
加密算法不用java写,用c语言写,用java调用 xx.so文件 xx.dll ,动态调试 汇编语言 ---》数据