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 ,动态调试   汇编语言   ---》数据
    
  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/fwzzz/p/12460457.html
Copyright © 2011-2022 走看看