zoukankan      html  css  js  c++  java
  • 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 ,动态调试   汇编语言   ---》数据
    
  • 相关阅读:
    iOS uiscrollView 嵌套 问题 的解决
    NSURLConnection 网络超时的那些事(转别人整理的)
    IOS 开发中判断NSString是否为空字符
    iOS- SQLite3的基本使用
    怎么应对 domino文档损坏然后损坏文档别删除导致数据丢失
    为什么Log.nsf中存储的日志只有最近7天的原因
    Struts,Spring,Hibernate优缺点
    Java面试之List的三个子类ArrayList,LinkedList,Vector区别
    Java面试之同步/异步/阻塞/非阻塞/BIO/NIO/AIO
    如何设置 Windows 开机启动项
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12460457.html
Copyright © 2011-2022 走看看