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版本,下载解压即可

img

查找方法

查找元素

这里列举一下常用的查找元素方法:
 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")')

img

获取元素属性

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)GoogleChromeApplicationchrome.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 ,动态调试   汇编语言   ---》数据
原文地址:https://www.cnblogs.com/fwzzz/p/12460457.html