精华内容
下载资源
问答
  • vba数据抓取屏幕数据 完美的Internet可以按照客户选择的格式(无论是CSV,XML,JSON等)向客户提供数据。真正的Internet有时会通过提供数据来取笑,但通常以HTML或PDF文档格式提供,而这些格式旨在显示数据比数据...

    vba数据抓取屏幕数据

    完美的Internet可以按照客户选择的格式(无论是CSV,XML,JSON等)向客户提供数据。真正的Internet有时会通过提供数据来取笑,但通常以HTML或PDF文档格式提供,而这些格式旨在显示数据比数据交换。 因此,昨天的屏幕抓取 (提取显示的数据并将其转换为请求的格式)在今天仍然很重要。

    Perl具有出色的屏幕抓取工具,其中包括以下Scraping程序中描述的HTML::TableExtract包。

    刮刮程序概述

    屏幕抓取程序有两个主要部分,它们组成如下:

    • 文件data.html包含要抓取的数据。 此示例中的数据源自正在装修的大学场所,该数据解决了与大学学位相关的收入是否证明该学位成本合理的问题。 数据包括中位数收入,百分位数,以及其他有关研究领域的信息,例如计算机,工程学和文科。 要运行Scraping程序,data.html文件应托管在Web服务器上(在我的情况下是本地Nginx服务器)。 一个独立的Perl Web服务器,例如HTTP::Server::PSGIHTTP::Server::Simple也可以。
    • 文件scrape.pl包含Scraping程序,该程序使用Plack/PSGI软件包(尤其是Plack Web服务器)中的功能。 从命令行启动Scraping程序(如下所述)。 用户在浏览器中输入Plack服务器的URL( localhost:5000/ ),将发生以下情况:
      • 浏览器连接到Plack服务器( HTTP::Server::PSGI的实例),并向Scraping程序发出GET请求。 URL末尾的单斜杠( / )标识此程序。 (即使用户没有这样做,现代的浏览器也会添加斜杠。)
      • 然后,Scraping程序对data.html文档发出GET请求。 如果请求成功,则应用程序使用HTML::TableExtract包从文档中提取相关数据,将提取的数据保存到文件中,并采取一些基本的统计措施来表示处理提取的数据。 如下所示HTML报告将返回到用户的浏览器。
    HTML report generated by the Scraping program

    图1:Scraping程序的最终报告

    从用户浏览器到Plack服务器,再到托管data.html文档的服务器(例如Nginx)的请求流量可以描述如下:

    
       
                  GET localhost:5000/             GET localhost:80/data.html
    user's browser------------------->Plack server-------------------------->Nginx

    最后一步仅涉及Plack服务器和用户的浏览器:

    
       
                 reportFinal.html
    Plack server------------------>user's browser

    上面的图1显示了最终报告文件。

    刮刮程序详细

    可从我的网站以包含自述文件的ZIP文件的形式获得源代码和数据文件(data.html)。 以下是各部分的简要摘要,下面将进行说明:

    
       
    data.html             ## data source to be hosted by a web server
    scrape.pl             ## main source code, run with the plackup utility (see below)
    Stats::Controller.pm  ## handles request routing, data extraction, and processing
    Stats::Util.pm        ## utility functions used in Controller.pm
    report.html           ## HTML template used to generate the report
    rawData.dat           ## the extracted data

    Plack/PSGI软件包带有一个名为plackup的命令行实用程序,可用于启动Scraping程序。 使用%作为命令行提示符,用于启动Scraping程序的命令为:

     % plackup scrape.pl 
    

    plackup命令启动承载Scraping程序的独立Plack Web服务器。 Scraping代码处理请求路由,从data.html文档中提取数据,产生一些基本的统计量,然后使用Template::Recall包为用户生成HTML报告。 由于Plack服务器会无限期运行,因此Scraping程序会打印进程ID,该ID可用于终止服务器和Scraping应用程序。

    Plack/PSGI支持Rails样式的路由,其中​​基于两个因素将HTTP请求分派到特定的请求处理程序:

    • HTTP请求方法( 动词 ),例如GET或POST。
    • 所请求资源的统一资源标识符(URI或名词 ); 在这种情况下,启动Scraping程序后,用户在浏览器中输入的URL http://localhost:5000/中的独立结束斜杠( / )。

    Scraping程序仅处理一种类型的请求:名为/的资源的GET,此资源是Stats::Controller程序包中的屏幕抓取和数据处理代码。 供您查看的是Plack/PSGI路由设置,它位于源文件scrape.pl的顶部:

    
       
    my $router = router {
        match '/' , { method => 'GET' } ,   ## noun/verb combo: / is noun, GET is verb
        to { controller => 'Controller' , action => 'index' } ; ## handler is function get_index
        # Other actions as needed
    } ;

    请求处理程序Controller::get_index仅具有高级逻辑,将屏幕抓取和生成报告的详细信息留在Util.pm文件中的实用程序函数中,如下节所述。

    屏幕抓取代码

    回想一下,Plack服务器将localhost:5000/的GET请求分派给Scraping程序的get_index函数。 然后,此函数作为请求处理程序,开始以下工作:检索要抓取的数据,抓取数据并生成最终报告。 数据检索部分属于实用程序功能,该功能使用Perl的LWP::Agent包从托管data.html文档的任何服务器上获取数据。 有了数据文档,Scraping程序将调用实用程序函数extract_from_html进行数据提取。

    data.html文档恰好是格式正确的XML,这意味着可以使用Perl包(例如XML::LibXML通过显式XML解析来提取数据。 但是, HTML::TableExtract软件包之所以HTML::TableExtract是因为它绕过了XML分析的HTML::TableExtract ,并且(用很少的代码)提供了提取数据的Perl哈希。 HTML文档中的数据聚合通常出现在列表或表中,而HTML::TableExtract程序包HTML::TableExtract表为目标。 这是数据提取的三个关键代码行:

    
       
    my $col_headers = col_headers ( ) ; ## col_headers() returns an array of the table's column names
    my $te = HTML :: TableExtract -> new ( headers => $col_headers ) ;
    $te -> parse ( $page ) ;   ## $page is data.html

    $col_headers引用一个Perl字符串数组,每个字符串在HTML文档中是一个列标题:

    
       
    sub col_headers {     ## column headers in the HTML table
        return [ "Area" ,
                "MedianWage" ,
                ...
                "BoostFromGradDegree" ] ;
    }

    调用TableExtract::parse函数之后,Scraping程序将使用TableExtract::rows函数在提取的数据行(没有HTML标记的数据行)上进行迭代。 这些行(作为Perl列表)被添加到名为%majors_hash的Perl哈希中,可以如下所示:

    • 每个键都标识一个研究领域,例如计算机工程学
    • 每个键的值是七个提取的数据项的列表,其中七个是HTML表中的列数。 对于Computing ,带有注释的列表是:
      
           
         name            median   % with this degree  income boost from GD
          /                 /             /            /
      ( Computing   55000   75000   112000   5.1 %   32.0 %   31.0 % )   ## data items
                    /              \           \
             25th - ptile      75th - ptile   % going on for GD = grad degree

    包含提取数据的哈希将写入本地文件rawData.dat:

    
       
    ForeignLanguage 50000 35000 75000 3.5% 54% 101%
    LiberalArts 47000 32000 70000 9.7% 41% 48%
    ...
    Engineering 78000 54000 104000 8.2% 37% 32%
    Computing 75000 51000 112000 5.1% 32% 31%
    ...
    PublicPolicy 50000 36000 74000 2.3% 24% 45%

    下一步是处理提取的数据,在这种情况下,将使用Statistics::Descriptive包进行基本的统计分析。 在上面的图1中,统计摘要显示在报告底部的单独表格中。

    报告生成代码

    Scraping程序的最后一步是生成报告。 Perl具有生成HTML的选项,其中包括Template::Recall 。 顾名思义,该程序包从HTML模板生成HTML,该模板是标准HTML标记和自定义标签的混合,这些自定义标签用作从后端代码生成的数据的占位符。 模板文件是report.html,感兴趣的后端函数是Controller::generate_report 。 这是代码和模板交互的方式。

    报告文档(图1)有两个表。 顶层表是通过迭代生成的,因为每一行都具有相同的列(学习区域,第25个百分位的收入等)。 在每次迭代中,代码都会使用特定学习领域的值创建一个哈希值:

    
       
    my %row = (
         major => $key ,
         wage   => '$' . commify ( $values [ 0 ] ) , ## commify turns 1234 into 1,234
         p25   => '$' . commify ( $values [ 1 ] ) ,
         p75   => '$' . commify ( $values [ 2 ] ) ,
         population   => $values [ 3 ] ,
         grad   => $values [ 4 ] ,
         boost => $values [ 5 ]
    ) ;

    散列键是Perl的裸字作为这样majorwage代表在早些时候从HTML数据文档中提取的数据值的列表项。 相应HTML模板如下所示:

    
       
    [ === even  === ]
    <tr class = 'even'>
       <td>['major']</td>
       <td align = 'right'>['p25']</td>
       <td align = 'right'>['wage']</td>
       <td align = 'right'>['p75']</td>
       <td align = 'right'>['pop']</td>
       <td align = 'right'>['grad']</td>
       <td align = 'right'>['boost']</td>
    </tr>
    [=== end1 ===]

    自定义标签在方括号中。 顶部和底部的标签分别标记了要渲染的模板区域的开始和结束。 其他自定义标签标识了后端代码的各个目标。 例如,标识为major的模板列将匹配具有major作为关键字的哈希条目。 这是后端代码中的调用,它将数据绑定到自定义标签:

     print OUTFILE $tr -> render ( 'end1' ) ; 
    

    引用$tr指向Template::Recall实例,而OUTFILE是报告文件reportFinal.html,它是由模板文件report.html与后端代码一起生成的。 如果一切顺利,则reportFinal.html文件就是用户在浏览器中看到的内容(见图1)。

    抓取程序借鉴了出色的Perl软件包,例如Plack/PSGILWP::AgentHTML::TableExtractTemplate::RecallStatistics::Descriptive用于处理屏幕数据抓取的HTML::TableExtract任务。 这些程序包可以很好地配合使用,因为每个程序包都针对特定的子任务。 最后,可以扩展Scraping程序以对提取的数据进行聚类: Algorithm::KMeans软件包适用于此扩展,并且可以使用rawData.dat文件中Algorithm::KMeans的数据。

    翻译自: https://opensource.com/article/18/6/screen-scraping

    vba数据抓取屏幕数据

    展开全文
  • 屏幕文字识别抓取软件,可选择屏幕区域上的地方抓取相应文字,简单易用,功能强大,支持多种类型的屏幕内容进行文字的识别抓取
  • Miscellaneous_playground Screenscraping->Hitqueuecalculator : 从 immi.gov.au 网站屏幕抓取父母签证 103 的电子队列数据 IndianNumberingSystem->SpellNumbersEngine: 正确拼写最多 21 位的印度数字
  • 屏幕抓取识别

    2014-08-06 17:18:05
    抓取屏幕就可以识别成文字,最好用的文字识别软件
  • 动态网页的抓取

    千次阅读 热门讨论 2021-06-04 21:32:21
    文章目录已写章节第五章 动态网页的抓取(Selenium)5.1 Ajax的原理5.2 Selenium的使用5.2.1 准备工作5.2.2 Selenium的使用1. 声明浏览器对象2. 访问页面3. 查找节点4. 查找多个节点5. 节点交互6. 动作链7. 滑动页面8....

    已写章节

    第一章 网络爬虫入门
    第二章 基本库的使用
    第三章 解析库的使用
    第四章 数据存储
    第五章 动态网页的抓取


    第五章 动态网页的抓取(Selenium)

    有时候我们在用requests抓取页面的时候,得到的结果可能和我们在浏览器中看到的结果不一样:在浏览器中可以正常看到页面数据,但是使用requests得到的结果并没有。这是因为requests库获取的都是原始的HTML文档,而在浏览器中看到的页面是经过JavaScript处理数据后生成的结果,这些数据来源有很多种,可能是通过Ajax加载的,可能是包含在HTML文档中的,也有可能是经过JavaScript和特定的算法计算后生成的。如果是通过Ajax加载的,原始页面最初不会包含某些数据,原始页面加载完之后,会再向服务器请求某个接口获取数据,然后数据才被处理从而呈现在网页上,这其实就是发生了一个Ajax请求。如果遇到这样的页面,需要分析出网页后台向服务器发送的Ajax请求,如果可以使用requests来模拟Ajax请求,那么就可以成功抓取了。


    5.1 Ajax的原理

    Ajax(Asynchronous JavaScript nad XML),即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证网页不被刷新、页面不改变的情况下与服务器交换数据并更新部分网页的技术。

    例如:打开tx视频,在电影中,鼠标的滑轮向下划,你会发现电影好像没有尽头,有时候最下面会出现加载的动画。页面其实并没有整个刷新,链接也并没有变化,但是网页中新增加了电影,这就是通过Ajax获取新数据并呈现的过程。

    Ajax有其特殊的请求类型,它是xhr,可以在Chrome的检查中选择xhr查看。

    模拟Ajax请求来爬取tx视频的例子:

    import requests
    from fake_useragent import UserAgent
    from lxml import etree
    import re
    from typing import NoReturn, List
    import time
    import mysql.connector
    
    def start() -> NoReturn:
        first_url = 'https://v.qq.com/channel/movie?listpage=1&channel=movie&itype=100062'
        base_url = 'https://v.qq.com/x/bu/pagesheet/list?append=1&channel=movie&itype=100062&listpage=2&offset={}&pagesize=30'
        create_table()
        storage_MysqlDB(get_page(first_url), 1)
        page_numbers = ((get_number_of_movies(first_url)-30)//30)+1
        for i in range(1, page_numbers):
            url = base_url.format(str(i*30))
            storage_MysqlDB(get_page(url), (i*30)+1)
            # time.sleep(5)
    
    
    def get_number_of_movies(url: str) -> int:
        headers = {
            'user-Agent': UserAgent().chrome
        }
        response = requests.get(url=url, headers=headers)
        response.encoding = response.apparent_encoding
        e = etree.HTML(response.text, etree.HTMLParser())
        number_of_movies = e.xpath('//body/div[5]/div/div/div/span/text()')[0]
        return int(number_of_movies)
    
    def get_page(url: str) -> List[List]:
        response = requests.get(url=url, headers={'user-Agent': UserAgent().chrome})
        response.encoding = response.apparent_encoding
        e = etree.HTML(response.text, etree.HTMLParser())
    
        all_div = e.xpath('//div[@class="list_item"]')
        res = []
        for div in all_div:
    
            movies_name = div.xpath('./div[1]/a/@title')
    
            hrefs = div.xpath('./div[1]/a/@href')
    
            performers = div.xpath('./div[1]/div/text()')
            performers = [i.replace('主演:', '') for i in performers]
    
            number_of_observers = div.xpath('./div[2]/text()')
    
            film_length = div.xpath('./a/div[1]/text()')
    
            score = div.xpath('./a/div[2]/text()')
    
    
    
            if len(movies_name) == 0:
                movies_name = ['None']
    
            if len(hrefs) == 0:
                hrefs = ['None']
    
            if len(performers) == 0:
                performers = ['None']
    
            if len(number_of_observers) == 0:
                number_of_observers = ['None']
    
            if len(film_length) == 0:
                film_length = ['None']
    
            if len(score) == 0:
                score = ['None']
    
            tem = []
            tem.append(str(movies_name[0]))
            tem.append(str(hrefs[0]))
            tem.append(str(performers[0]))
            tem.append(str(number_of_observers[0]))
            tem.append(str(film_length[0]))
            tem.append(str(score[0]))
            res.append(tem)
        print(res)
        return res
    
    
    def create_table():
        mydb = mysql.connector.connect(
            host='localhost',
            user='root',
            passwd='123456',
            port=3307,
            charset='utf8'
        )
        mycursor = mydb.cursor()
        sql_create_table = [
            "USE reptile;",
            "CREATE TABLE IF NOT EXISTS tencent_movies(\
             ID INT AUTO_INCREMENT COMMENT '编号',\
             movies_name VARCHAR(40) COMMENT '电影名',\
             hrefs VARCHAR(100) COMMENT '链接',\
             performers VARCHAR(100) COMMENT '主演',\
             number_of_observers VARCHAR(20) COMMENT '播放量',\
             film_length VARCHAR(20) COMMENT '电影时长',\
             score varchar(4) COMMENT '评分',\
             PRIMARY KEY(ID)\
             )COMMENT = 'All movie information in Tencent video'\
             ENGINE = INNODB CHARSET='utf8mb4' COLLATE='utf8mb4_unicode_ci';"
        ]
        for i in sql_create_table:
            mycursor.execute(i)
    
    def storage_MysqlDB(data: List, start: int)-> None:
        mydb = mysql.connector.connect(
            host='localhost',
            user='root',
            passwd='123456',
            port=3307,
            charset='utf8',
            database='reptile'
        )
        mycursor = mydb.cursor()
        sql_insert = "insert into tencent_movies values(%s, %s, %s, %s, %s, %s, %s)"
        for i in data:
            i.insert(0, start)
            new_i = tuple(i)
            mycursor.execute(sql_insert, new_i)
            # print(start)
            # time.sleep(1)
            start += 1
        mydb.commit()
        mycursor.close()
    
    if __name__ == '__main__':
        start()
    

    在上面,我们介绍了Ajax,并使用requests来模拟Ajax请求来爬取数据。

    但是,JavaScript动态渲染页面不止Ajax这一种。有很多网页是由JavaScript产生的,并不会包含Ajax请求。淘宝页面也是使用Ajax来获取数据的,但是,他的Ajax接口中包含许多的加密参数,我们很难找出其规律,也很难使用requests来模拟Ajax请求。

    为了解决这些问题,我们可以直接使用模拟浏览器的方式来实现,这样就可以做到在浏览器中看到什么样子,抓取的源码就是什么样子。


    5.2 Selenium的使用

    Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如下拉、点击按钮、在文本框中输入文字、下划页面等动作,同时还可以获取浏览器当前呈现的页面的源代码。可以将Selenium看做是个通过代码来控制浏览器的工具。


    5.2.1 准备工作

    • 需要下载与你的Chrome版本相对应的ChromeDriver
    • 安装Selenium库
    • 将下载好的浏览器驱动放在Python的安装目录下的Scripy目录中

    注意:使用Edge的驱动器会提示要将驱动添加到path中,可以在初始化一个Edge浏览器对象的时候传入Edge驱动的路径:

    from selenium import webdriver
    
    browser = webdriver.Edge('E:\python\Scripts\msedgedriver.exe') 
    browser.get('https://www.baidu.com')
    

    所以建议大家使用Chrome浏览器。

    ChromeDriver下载地址

    Edge驱动下载地址

    Selenium官方文档


    5.2.2 Selenium的使用

    当所有的准备工作都完成后,打开编辑器,来敲代码了。

    首先来看看下面这个小例子:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    browser = webdriver.Chrome()  # 声明一个chrome浏览器对象
    try:
        browser.get('https://www.baidu.com')   # 打开指定的网页
        input = browser.find_element_by_id('kw')   # 寻找搜索框
        input.send_keys('Python')   # 在搜索框中输入指定的内容
        input.send_keys(Keys.ENTER)
        wait = WebDriverWait(browser, 10)
        wait.until(EC.presence_of_all_elements_located((By.ID, 'content_left')))
        print(browser.current_url)  # 打印当前页面的url
        print(browser.get_cookies()) # 打印当前页面的cookies
        print(browser.page_source)  # 打印当前页面的源代码
    finally:
        browser.close()
    

    执行上面的代码,如果一切正常的话,你的电脑应该自动打开了Chrome浏览器并来到了百度的首页,然后自动在搜索框中输入了“Python”并点击了搜索按钮,控制台中打印出当前页面的url、cookie、页面源代码。


    1. 声明浏览器对象

    Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。

    下面是初始浏览器的方法:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser = webdriver.Firefox()
    browser = webdriver.Edge()
    browser = webdriver.PhantomJS()
    browser = webdriver.Safari()
    

    注意:
    可以指定驱动器路径来初始化浏览器对象:

    browser = webdriver.Edge(‘E:\python\Scripts\msedgedriver.exe’)


    2. 访问页面

    可以使用get()方法来请求网页,将要请求的url传入即可,下面是请求百度的例子:

    from selenium import webdriver
    import time
    
    browser = webdriver.Edge('E:\python\Scripts\msedgedriver.exe')
    browser.get('https://www.baidu.com')
    print(browser.page_source)
    time.sleep(10)
    browser.close()
    

    3. 查找节点

    Selenium可以驱动浏览器完成各种操作,比如填充表单、模拟点击等。比如,我们想要完成在某个输入框输入文本的操作,我们首先需要使用selenium查找到这个输入框所在的节点位置。


    • 查找单个节点的常用方法

      查找单个节点的方法
      find_element_by_id()通过节点的id属性值来查找单个节点
      find_element_by_name()通过节点的name属性值来查找单个节点
      find_element_by_xpath()通过xpath来查找单个节点
      find_element_by_link_text()通过完整的链接文本(点击该文本就会跳到另一个页面)查找单个节点
      find_element_by_partial_link_text()通过部分链接文本来查找单个节点
      find_element_by_tag_name()通过节点的标签名来查找单个节点
      find_element_by_class_name()通过节点的class属性值来查找单个节点
      find_element_by_css_selector()通过css来查找当个节点
      find_element(By.ID,‘ ’)同find_element_by_id()
      find_element(By.CLASS_NAME, ‘ ’)同find_element_by_class_name()
      find_element(By.CSS_SELECTOR,’ ’)同find_element_by_css_selector()
      find_element(By.LINK_TEXT,’ ’)同find_element_by_link_text()
      find_element(By.NAME,’ ’)同find_element_by_name()
      find_element(By.PARTIAL_LINK_TEXT,’ ’)同find_element_by_partial_link_text()
      find_element(By.TAG_NAME,’ ’)同find_element_by_tag_name()
      find_element(By.XPATH,’ ’)同find_element_by_xpath()

    例子:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    browser = webdriver.Chrome()
    url = 'https://www.taobao.com/'
    browser.get(url)
    print(browser.find_element(By.ID, 'q'))
    print(browser.find_element_by_id('q'))
    print(browser.find_element_by_xpath('//*[id="q"]'))
    print(broswer.find_element_by_css_selector('#q'))
    

    运行结果:

    <selenium.webdriver.remote.webelement.WebElement (session="5e8df8d577c9340c9524ecebcf924800", element="18f8aa32-46d6-43cd-89b1-67e48e314310")>
    <selenium.webdriver.remote.webelement.WebElement (session="5e8df8d577c9340c9524ecebcf924800", element="18f8aa32-46d6-43cd-89b1-67e48e314310")>
    <selenium.webdriver.remote.webelement.WebElement (session="5e8df8d577c9340c9524ecebcf924800", element="18f8aa32-46d6-43cd-89b1-67e48e314310")>
    <selenium.webdriver.remote.webelement.WebElement (session="5e8df8d577c9340c9524ecebcf924800", element="18f8aa32-46d6-43cd-89b1-67e48e314310")>
    

    4. 查找多个节点

    在网页中如果查找的节点有多个,使用find_element()方法将只会找到第一个节点,如果想要查找多个节点,就需要使用find_elements()方法。

    from selenium import webdriver
    
    with webdriver.Chrome() as browser:
        browser.get('https://www.taobao.com')
        all_nodes = browser.find_elements_by_xpath('//li[@class="J_Cat a-all"]')
        print(len(all_nodes))
        print(all_nodes)
    

    上面的代码将自动使用Chrome打开淘宝的主页,打印出查找到的淘宝主页左上角的15个导航栏。

    将上面的表格中查找单个节点的方法中的element改为elements就是查找多个节点的方法。


    5. 节点交互

    Selenium可以驱动浏览器来执行一些操作,也就是可以让浏览器执行一些动作。

    常用的有:输入文字时用send_keys()方法,清空文字时用clear()方法,点击时用click()方法。

    from selenium import webdriver
    import time
    
    with webdriver.Chrome() as browser:
        browser.get('https://www.taobao.com')  # 打开链接
        input = browser.find_element_by_xpath('//*[@id="q"]')  # 找到搜索框
        input.send_keys('背包')  # 在搜索框中输入背包
        time.sleep(5)
        input.clear()  # 清空搜索框
        input.send_keys('书包')  # 在搜索框中输入书包
        search_button = browser.find_element_by_xpath('//button[@class="btn-search tb-bg"]')  # 查找搜索按钮
        time.sleep(5)
        search_button.click()  # 点击搜索按钮
    

    6. 动作链

    上面的选择输入框、向输入框中输入文本、点击按钮等动作,都是有特定的执行对象;但是,对于鼠标移动、按盘按键等,这些动作由另一种方式来执行,这就是动作链。

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    import time
    
    browser = webdriver.Chrome()
    browser.get('示例网站的url')
    browser.find_element_by_xpath('//input[@placeholder="请输入邮箱"]').send_keys('jxd')
    time.sleep(1)
    browser.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys('123456')
    time.sleep(1)
    browser.find_element_by_xpath('//div[@class="geetest_wait"]').click()
    time.sleep(1)
    
    # 更换监视界面
    ifame = browser.find_element_by_xpath('//div[@class="inner-conntent"]')
    browser.switch_to.frame(ifame)
    # 要拖动的元素
    source = browser.find_element_by_xpath('//div[@class="geetest_slider_button"]')
    # 要拖动到的位置元素
    target = browser.find_element_by_xpath('//div[@class="geetest_slider_tip geetest_fade"]')
    actions = ActionChains(browser)
    actions.drag_and_drop(source, target)
    actions.perform()
    

    7. 滑动页面

    滑动页面其实就是执行js语句,可以将控制页面滑动的js语句放在driver.execute_script(js语句)中来执行:

    driver.execute_script('window.scrollBy(0,1000)')  # 滑动的距离,分为x轴和y轴
    
    driver.execute_script('window.scrollTo(0,1000)')  # 滑动到指定的坐标
    
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")  # 滑动到页面的最下方
    
    driver.execute_script("document.getElementById('page').scrollIntoView(true)") # 将查找到的元素显示在屏幕中间,scrollIntoView(false)就是将查找到的元素显示在屏幕的底部 
    

    8. 执行JavaScript

    上面的向下滑动页面就是执行JavaScript的例子,我们可以使用driver.execute_script(javascript语句)来执行JavaScript代码。


    9. 获取节点的信息

    方法作用
    WebElement.get_attribute(‘属性名’)获取标签指定的属性的属性值
    WebElement.text获取标签的文本
    WebElement.id获取标签的id
    WebElement.location获取标签在页面中的相对位置
    WebElement.tag_name获取标签的标签名
    WebElement.size获取标签的大小

    10. 切换Frame

    网页中有一种节点叫做iframe,也就是子页面,我们使用selenium提供的选择节点的方法是在父级Frame里面操作,而如果页面中有子页面,它是不能获取到子Frame中的节点的。此时,就需要使用switch_to.frame()方法来切换Frame,上面的例子中有。

    注意:switch_to.frame()默认接收的是目标frame节点的id或name,如果目标节点没有id属性和name属性,那么就可以传入一个用select_element_by_xpath()等方法定位到的WebElement对象。


    11. 等待

    有时我们请求的页面中的元素或节点是通过Ajax加载的,就需要一定的时间,在元素未加载出来之前我们去查找该元素就会找不到,所以,就需要等待一段时间,等元素加载出来之后再执行查找元素等一系列操作。


    隐式等待:在查找节点而节点并没有立即出现时,隐式等待会等待一段时间再查找节点,时间默认是0秒,如果还未找到节点就会抛出节点未找到的异常。隐式等待可以看做是time.sleep()方法。

    browser.imlicitly_wait(10)  # 隐式等待10秒钟
    

    显示等待:规定一个最长等待时间,在这段时间里如果查找到了节点就返回节点,如果在这段时间里还找到该节点,则抛出超时异常。

    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(browser, 10)  # 设置显式等待时间是10秒
    input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
    

    until()方法接收一个等待条件expected_conditions,上面的例子中的等待条件是presence_of_element_located(),指的是节点出现的意思,其参数是节点的定位元组,也就是ID为q的节点。


    常见的等待条件

    等待条件含义
    title_is标题是某内容
    title_contains标题包含某内容
    presence_of_element_located节点加载出来,传入定位元组,如(By.ID, ‘p’)
    visibility_of_element_located节点可见,传入定位元组
    visibility_of节点可见,传入节点对象
    presence_of_all_elements_located所有节点加载出来
    text_to_be_present_in_element某个节点文本包含某个文字
    text_to_be_present_in_element某个节点值包含某个文字
    frame_to_be_avaliable_and_switch_to_it加载并切换
    invisibility_of_element_located节点不可见
    element_to_be_clickable节点可点击
    staleness_of判断 个节点是否仍在 DOM ,可判断页面是杏已经刷新
    element_ to_be_selected节点可选择,传节点对象
    element_located_to_be_selected节点可选择,传人定位元组
    element_selection_state_to_be传人节点对象以及状态,相等返回 True ,否则返回 False
    element_located_selection_state_to_be传入定位元组以及状态,相等返回 True ,否则返回 False
    alert_is_present是否出现警告

    12. 控制页面前进和后退

    from seleniun import webdriver
    
    browser.forward()    # 前进
    browser.back()   # 后退
    

    13. 对cookies的操作

    from selenium import webdirver
    
    browser.get_cookies()  # 返回字典类型的所有cookies
    browser.add_cookies()  # 添加一个cookies,参数是字典类型
    browser.delete_all_cookies()   # 删除所有的cookies
    

    14. 选项卡

    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome()  # 初始化一个浏览器对象
    
    browser.get('https://www.baidu.com')  # 访问百度
    browser.execute_script('window.open()')   # 新开启一个选项卡
    time.sleep(2)
    
    print(browser.window_handles)  # 打印所有选项卡代号列表
    
    browser.switch_to.window(browser.window_handles[1])   # 更换到选项卡代号列表中的第一个选项卡
    time.sleep(1)
    
    browser.get('https://www.taobao.com')
    browser.switch_to.window(browser.window_handles[0])
    time.sleep(1)
    
    browser.get('https://python.org')
    

    15. 模拟输入键盘

    上面讲的sendkeys()方法可以向输入框中输入文字,它还可以实现模拟键盘的输入,甚至是组合键。

    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Firefox()
    driver.get([https://www.baidu.com](https://www.baidu.com/))
    
    el = driver.find_element(By.ID, "kw") # 找到输入框
    el.send_keys(“seleniumm”)             # 在输入框中输入"seleniumm"
    el.send_keys(Keys.BACK_SPACE)         # 模拟按一下Backspaece键
    el.send_keys(Keys.SPACE)              # 模拟按一下Space键
    el.send_keys(“教程”)                  # 输入"教程"
    el.send_keys(Keys.CONTROL, ‘a’)       # 模拟按下 "a"键
    el.send_keys(Keys.CONTROL, ‘x’)       # 模拟按下 "x"键
    el.send_keys(Keys.CONTROL, ‘v’)       # 模拟按下 "v"键
    el.send_keys(Keys.ENTER)              # 模拟按下"enter"键
    

    16. 异常处理

    selenium的异常类型都在selenium.common.exceptions这个包中,下面列举了常用的异常:

    异常说明
    NoSuchElementException未找到节点
    NoSuchAttributeException节点没有改属性
    NoSuchFrameExceptionframe未找到
    NoSuchWindowExceptionwindow未找到

    知道这些常用的异常之后,就可以使用try except来将这些异常捕获并做相应的处理了。


    5.3 使用Selenium的例子

    使用Selenium爬取手机信息


    感谢你的阅读!

    展开全文
  • win抓取屏幕弄成流数据&流数据展示

    千次阅读 2018-04-06 20:31:46
    设备dcDC实际上是GDI内部保存的数据结构。DC与特定的显示设备(如显示器或打印机)相关。 对于显示器,DC总是与显示器上的特定视窗相关。DC中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。例如,...

    一. 概念

    1.设备dc

    DC实际上是GDI内部保存的数据结构。
    DC与特定的显示设备(如显示器或打印机)相关。 
    对于显示器,DC总是与显示器上的特定视窗相关。

    DC中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。
    例如,对於TextOut,DC的属性确定了文字的颜色、文字的背景色、x座标和y座标映射到视窗的显示区域的方式,以及显示文字时Windows使用的字体。 
    MSDN的解释:一个DC是一个结构,它定义了一系列图形对象的集合以及它们相关的属性,以及影响输出效果的一些图形模式。这些图形对象包括一个画线的笔,一个填充和painting的画刷,一个用来向屏幕拷贝的位图,一个定义了一系列颜色集合的调色板,一个用来剪裁等操作的区域,一个做painting和drawing操作的路径。

    一个应用程序从不直接地访问(access)dc,常见的取得dc的方式有以下几种:
    SDK's way: 
    [1]. BeginPaint 
    case WM_PAINT: HDC hdc = BeginPaint(hwnd, &ps);EndPaint(hwnd, &ps); 
    MSDN的解释:
     BeginPaint函数自动地设置dc的剪裁区域,这个剪裁区域,剪裁的是由InvalidateRect 或 InvalidateRgn函数触发的窗口无效区域,或者是系统给出的无效区域,当窗口被sizing,moving, creating, scrolling, or any other operation that affectsthe client area.
    一个应用程序从不调用BeginPaint,除了在收到一个WM_PAINT消息的时候每一BeginPaint调用之后,需要调用EndPaint函数。

    [2].GetXXXDC

    GetDC取得与窗口客户区相关的dc,GetWindowDC取得与整个窗口(包括客户区和非客户区)相关的dc。

    2. 内存dc

    是一个虚拟的内存设备上下文,我们对它进行绘图等操作,不会显示在屏幕或打印机上,而我们可以在它完成之后,拷贝到屏幕上或打印机上来输出,这样我们可以避免因为操作而给屏幕带来的闪烁,对于打印机而言,打印只能是从上往下打,而我们在MEMDC中,可以随意进行操作,这样可以输出直接在打印机上输出所达不到的效果.

    在窗口上贴图一般总是要用到内存DC,将所有的绘制工作先绘制在内存DC上,然活一次性拷贝到屏幕DC上,就是这样了。


    二. 实战

    1. 获取屏幕流

    HWND hDeskTopWnd = ::GetDesktopWindow();//获得屏幕的HWND.
    HDC hScreenDC = ::GetDC(hDeskTopWnd);   //获得屏幕的HDC.
    HDC MemDC = ::CreateCompatibleDC(hScreenDC);	   //创建一个内存中的DC
    RECT rect;
    ::GetWindowRect(hDeskTopWnd, &rect);
    SIZE screensize;
    screensize.cx =  rect.right - rect.left;
    screensize.cy = rect.bottom - rect.top;
    
    HBITMAP hBitmap;
    hBitmap = ::CreateCompatibleBitmap(hScreenDC, screensize.cx, screensize.cy);	   //创建一个内存中的位图
    HGDIOBJ hOldBMP = ::SelectObject(MemDC, hBitmap);		  //把位图和DC绑定在一起
    BitBlt(MemDC, 0, 0, screensize.cx, screensize.cy, hScreenDC, 0, 0, SRCCOPY);	 //把整个屏幕的内容复制到内存DC中
    
    BITMAPINFO bitInfo = { 0 };
    bitInfo.bmiHeader.biSize = sizeof(bitInfo.bmiHeader);
    //第一次调用GetDIBits获得图片的大小
    int result = -1;
    result = ::GetDIBits(MemDC, hBitmap, 0, screensize.cy, nullptr, &bitInfo, DIB_RGB_COLORS);
    bitInfo.bmiHeader.biCompression = BI_RGB;
    bitInfo.bmiHeader.biPlanes = 1;
    if (result)
    {
    	char* tempBuffer = (char*)malloc(bitInfo.bmiHeader.biSizeImage);
    	memset(tempBuffer, 0, bitInfo.bmiHeader.biSizeImage);
    	//第二次调用GetDIBits取图片流数据
    	GetDIBits(MemDC, hBitmap, 0, screensize.cy, tempBuffer, &bitInfo, DIB_RGB_COLORS);
    	//...............
    	free(tempBuffer);
    }
    ::SelectObject(MemDC, hOldBMP);
    ::DeleteObject(MemDC);
    ::ReleaseDC(hWnd, hScreenDC);

    2. 显示流数据

    //nWidth图片的宽度,nHeight图片的高度,pImgBuffer里面装的是数据流,此处只是给出个形式
    LONG nWidth;
    LONG nHeight;
    std::vector<unsigned char> pImgBuffer;   
    
    //此处如果来源的流数据是ARGB,需要转成BGRA
    auto& buffer = pImgBuffer;
    for (int index_i = 0; index_i < (INT)tempSize; index_i += 4) {
    	auto temp = buffer.data()+index_i;
    	std::swap(temp[0], temp[3]);
    	std::swap(temp[1], temp[2]);
    }
    
    HDC   hdc;
    hdc = GetDC(m_hd);
    BITMAPINFO bitInfo = { 0 };
    bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitInfo.bmiHeader.biHeight = -nHeight;
    bitInfo.bmiHeader.biWidth = nWidth;
    bitInfo.bmiHeader.biPlanes = 1;
    bitInfo.bmiHeader.biBitCount = 32;
    bitInfo.bmiHeader.biSizeImage = tempSize;
    bitInfo.bmiHeader.biCompression = BI_RGB;
    
    //当图像涉及到缩小的时候,一定要加下面这句,要不然图片会失真
    SetStretchBltMode(hdc, STRETCH_HALFTONE);
    
    StretchDIBits(
    	hdc,
    	0,
    	0,
    	nWidth,
    	nHeight,    //目标rect范围
    	0,
    	0,
    	nWidth,
    	nHeight,	//源rect范围
    	pImgBuffer.data(),
    	(BITMAPINFO*)&bitInfo,
    	DIB_RGB_COLORS,
    	SRCCOPY);

    展开全文
  • 用Beautiful Soup进行屏幕抓取

    千次阅读 2017-08-29 09:48:26
    数据抓取操作步骤 创建用于发送HTTP请求时将用到的所有值 发出HTTP请求并下载所有数据 解析这些数据文件中需要的数据, 具体操作步骤首先需要弄清需要访问哪个URL以及需要哪种HTTP方法。HTTP方法类似于:method=&...

    数据抓取操作步骤

    1. 创建用于发送HTTP请求时将用到的所有值
    2. 发出HTTP请求并下载所有数据
    3. 解析这些数据文件中需要的数据,

    具体操作步骤

    首先需要弄清需要访问哪个URL以及需要哪种HTTP方法。HTTP方法类似于:

    method="post"
    

    URL类似于:

    action="Data_Elements.aspx?Data=2"
    

    Beautiful Soup

    Beautiful Soup是一个Python库,用于从HTML和XML文件中提取数据。它使用您喜欢的解析器来提供导航、搜索和修改解析树的惯用方法。它通常节省程序员几个小时或几天.

    下面是中文帮助文档链接https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

    这是不同的beautiful soup解析器的比较

    这里写图片描述

    用Beautiful Soup提取隐藏字段

    任务:使用 BeautifulSoup 处理 HTML,提取出
    "__EVENTVALIDATION”和“__VIEWSTATE”的隐藏表格字段值,并在数据字典中设置相应的值。

    代码实现:

    def extract_data(page):
    # 同之前的方法一样,定义字典,方便对键赋值
        data = {"eventvalidation": "",
                "viewstate": ""}
        with open(page, "r") as html:
    # 这里用lxml解析器,后文会做简要介绍
            soup = BeautifulSoup(html, "lxml")
            ev = soup.find(id="__EVENTVALIDATION")
    # 把ev中value的值取出来给data的键
            data["eventvalidation"] = ev["value"]
    
            vs = soup.find(id="__VIEWSTATE")
            data["viewstate"] = vs["value"]
    
        return data
    

    解析器图片

    推荐使用lxml作为解析器,因为效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必须安装lxml或html5lib, 因为那些Python版本的标准库中内置的HTML解析方法不够稳定.

    提示: 如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的

    find()方法

    find( name , attrs , recursive , text , **kwargs )

    find_all() 方法将返回文档中符合条件的所有tag,尽管有时候我们只想得到一个结果.比如文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法.下面两行代码是等价的:

    soup.find_all('title', limit=1)
    # [<title>The Dormouse's story</title>]
    
    soup.find('title')
    # <title>The Dormouse's story</title>
    

    唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果.

    find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时,返回 None .

    print(soup.find("nosuchtag"))
    # None
    

    soup.head.title 是 tag的名字 方法的简写.这个简写的原理就是多次调用当前tag的 find() 方法:

    soup.head.title
    # <title>The Dormouse's story</title>
    
    soup.find("head").find("title")
    # <title>The Dormouse's story</title>
    

    练习:获取运营商列表

    任务

    获取一个包含所有航空公司的列表。在你所返回的数据中要去掉所有类似 “All U.S. Carriers” 的组合。最终你应该返回一个含有运营商编码的列表。

    部分被处理代码:

    	    <tr>
    	        <td style="width: 450px">
    	            <select name="CarrierList" id="CarrierList" class="slcBox" style="width:450px;">
    	<option selected="selected" value="All">All U.S. and Foreign Carriers</option>
    	<option value="AllUS">All U.S. Carriers</option>
    	<option value="AllForeign">All Foreign Carriers</option>
    	<option value="FL">AirTran Airways</option>
    	<option value="AS">Alaska Airlines </option>
    	<option value="AA">American Airlines </option>
    	<option value="MQ">American Eagle Airlines </option>
    	<option value="5Y">Atlas Air </option>
    	<option value="DL">Delta Air Lines </option>
    	<option value="EV">ExpressJet Airlines </option>
    	<option value="F9">Frontier Airlines </option>
    	<option value="HA">Hawaiian Airlines </option>
    	<option value="B6">JetBlue Airways</option>
    	<option value="OO">SkyWest Airlines </option>
    	<option value="WN">Southwest Airlines </option>
    	<option value="NK">Spirit Air Lines</option>
    	<option value="US">US Airways </option>
    	<option value="UA">United Air Lines </option>
    	<option value="VX">Virgin America</option>
    
    </select>
    	        
    	        </td>
    	        
    	        <td style="width: 250px">
    	            <select name="AirportList" id="AirportList" class="slcBox" style="width:250px;">
    	<option selected="selected" value="All">All</option>
    	<option value="AllMajors">All Major Airports</option>
    	<option value="ATL"> - Atlanta, GA: Hartsfield-Jackson Atlanta International</option>
    	<option value="BWI"> - Baltimore, MD: Baltimore/Washington International Thurgood Marshall</option>
    	<option value="BOS"> - Boston, MA: Logan International</option>
    	<option value="CLT"> - Charlotte, NC: Charlotte Douglas International</option>
    	<option value="MDW"> - Chicago, IL: Chicago Midway International</option>
    	<option value="ORD"> - Chicago, IL: Chicago O'Hare International</option>
    	<option value="DFW"> - Dallas/Fort Worth, TX: Dallas/Fort Worth International</option>
    	<option value="DEN"> - Denver, CO: Denver International</option>
    	<option value="DTW"> - Detroit, MI: Detroit Metro Wayne County</option>
    	<option value="FLL"> - Fort Lauderdale, FL: Fort Lauderdale-Hollywood International</option>
    	<option value="IAH"> - Houston, TX: George Bush Intercontinental/Houston</option>
    	<option value="LAS"> - Las Vegas, NV: McCarran International</option>
    	<option value="LAX"> - Los Angeles, CA: Los Angeles International</option>
        <option value="AllOthers">All Other Airports</option>
        <option value="ABR"> - Aberdeen, SD: Aberdeen Regional</option>
        <option value="ABI"> - Abilene, TX: Abilene Regional</option>
    </select>
    

    解决方法:

    def extract_carriers(page):
        data = []
    
        with open(page, "r") as html:
            soup = BeautifulSoup(html, 'lxml')
    # find方法里为什么必须要用id定位:问题一
            carrier_list=soup.find(id='CarrierList')
            options=carrier_list.find_all('option')
            for tag in options:
    # 取出标签value所对应的值,添加到列表中。不要标签值中带有All的
                if 'All' not in tag['value']:
                    data.append(tag['value'])
        return data
    

    问题一回答

    注意find()方法格式:find( name, attrs, recursive, text, **kwargs)。
    虽然name标签也是具有唯一性的,但由于 find 函数已经使用 name 参数名称来接受 tag 类型的信息,下面两个语句其实是等价的:

    carrier_tag = soup.find(name='CarrierList')
    carrier_tag = soup.find('CarrierList')
    

    相当于搜索这类标签: ,那么在当前情况下必然是搜索不到的~

    如果想使用 name 属性来搜索,可以使用以下语法:

    carrier_list = soup.find('select', {'name': 'CarrierList'})
    

    练习:处理所有数据

    练习:专利数据库

    处理XML局部文件时通常会遇到这样的错误:Error parsing XML: junk after document element。这是因为一般合法的XML文件只有一个主根节点,比如:

    <android123>
        <item1/>
        <item2/>
        <item3/>
    </android123>
    

    如果出现了Error parsing XML: junk after document element这样的错误,你的想法可能只要主根有多个节点

    <android123>
        <item1/>
    </android123>
    <android123>
        <item2/>
        <item3/>
    </android123>
    

    事实上通常情况下,这种文件通常是由多个相连的 XML 文档构成的。一种解决方法是将文件拆分为多个文档,并将这些文档处理为有效的 XML 文档。

    任务:按照<?xml version="1.0" encoding="UTF-8"?>进行分割,将一个不合格的XML文件分割为合格的XML文件。实现代码如下:

    def split_file(filename):
        with open(filename) as infile:
            n = -1 # 由于第一次遇到 '<?xml' 时会关闭文件,导致跳空一次
                   # 所以临时从 -1 开始,保证能从 0 正式开始
            outfile = open('{}-{}'.format(filename, n), 'w') # 单独打开
    
            for line in infile:
                if line.startswith('<?xml'):
                    # 每次切换步骤:关闭、+1、再打开
                    outfile.close() 
                    n += 1       
                    outfile = open('{}-{}'.format(filename, n),'w')
    
                outfile.write(line)
                
            outfile.close() # 记得用完关闭
    

    更多精彩内容,欢迎关注我的微信公众号:数据瞎分析
    在这里插入图片描述

    展开全文
  • 本文介绍动态页面和Ajax渲染页面数据抓取的示例,以及相应的页面分析过程。 Ajax抓取示例 现在越来越多的网页的原始HTML文档不包括任何数据,而是采用Ajax统一加载。发送Ajax请求道网页更新的过程: 发送请求。 ...
  • Windows窗体数据抓取详解

    千次阅读 2018-04-22 21:04:22
    此处我们就抓取记事本内容吧(内容在Edit控件中) 最后,就是实时更新、存储数据即可,进行后期逻辑处理 获取进程ID 首先当我们知道进程名,通过进程名获取进程ID,我们需要用到一个Win32的进程快照模块:...
  • chrome 抓取图片So you have a website you want to scrape? But don’t necessarily know what package to use or how to go about the process. This is common when first starting out web scraping. ...
  • Web Scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据。例如知乎回答列表、微博热门、微博评论、淘宝、天猫、亚马逊等电商网站商品信息、...
  • Discord Bot会在我们当中抓取屏幕数据,并在游戏过程中自动使玩家静音/取消静音! discord Bot将在屏幕上捕捉“我们之间”的数据,并在游戏过程中自动使玩家静音/取消静音! 实施但在Go中开发的BetweenUsBot,并具有...
  • 抖音短视频数据抓取实战系列(十二)——抓取实战BUG总集1、模拟器自带的Xposed框架无法安装。2、Fiddler无法监测雷电模拟器上的数据。3、模拟器抖音用户详情页为空(未解决)。4、pip版本更新。5、mitmdump报killed...
  • C++屏幕抓图代码- 抓取屏幕 保存位图 标签:抓图 截屏 热键 更新时间:2014-05-26 本程序是利用通用的热键管理DLL 实现的热键功能,在收到热键通知后截取屏幕的内容并保存到BMP 文件中。编译并运行本例...
  • Android中网页数据抓取和修改

    千次阅读 2017-03-01 22:37:40
    在Android中经常会使用WebView加载网页,进行网页数据的展示,但是有时候需要从网页中动态抓取数据,进行处理,甚至对网页的数据进行修改,使其动态的展示效果,候WebView就显得无能为力了,最新项目中就有这样的...
  • 使用WinSock网络编程和MFC网络编程技术,系统采用C/S模式,Client端运用了MFC和SDK混合编程的方法,调用WinSock控件和API函数来实现控制操作,Server端主要是运用WinSock完成屏幕抓取数据传输。实验结果表明,该...
  • 这是因为我在测试的时候发现现在抖音加入了某种时钟,我们都知道uiautomatorviewer无法获取动态页面的数据,而我发现monitor有的界面却可以,所以使用monitor,下面开始 首先用鼠标点击左边画蓝色圈的地方获取当前...
  • 如何抓取实时数据

    2021-06-11 11:42:10
    实时抓取数据只是这个技术驱动世界的革命性方面之一。我们即将告诉您如何通过沉迷于抓取实时数据将您的业务提升到一个新的水平。在线可用的数据量巨大,而且还在不断变化;因此,如果您想在这个竞争激烈的世界中保持...
  • Web数据采集(抓取)介绍

    千次阅读 2015-07-07 22:38:45
    Web数据抓取程序模拟浏览器的行为,能将可以在浏览器上显示的任何数据提取出来,因此也称为屏幕抓取(Screenscraping)。Web数据抓取的最终目的是将非结构化的信息从大量的网页中抽取出来以结构化的方式存储(CSV、 ...
  • VBA抓取屏幕

    千次阅读 2011-12-14 10:45:55
    需要说明的是 关于"user32"下被调用函数的声明,私用...抓取活动窗口的 Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal _ bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As
  • 需要抓取某金融网站的期货数据,通过开启浏览器的开发者模式,找到接口url,其响应的数据正是我们所要的,但是当我们在浏览器地址栏中输入该url后,重定向到了该网站的期货主页,抓取不到数据。 解决方案 找到...
  • 1、使用的IDE和编辑器IDE:PyCharm 、 Visual Studio编辑器:Vim 、Sublime Text等抓包工具:fiddler python需要导入各种各样... HTML页面的内容抓取(数据抓取)3. HTML页面的数据提取(数据清洗)4. Scrapy框架以...
  • 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib。 在 python2 中,urllib 被分为urllib,urllib2等 u...
  • c++ 抓取桌面屏幕并转为jpg图片

    千次阅读 2019-10-10 12:06:50
    抓取屏幕代码 char* getScreen(unsigned long &jpg_size){ HWND DeskWnd=::GetDesktopWindow();//获取桌面窗口句柄 RECT DeskRC; ::GetClientRect(DeskWnd,&DeskRC);//获取窗口大小 HDC DeskDC=...
  • Scrapely Scrapely是一个用于从HTML页面提取结构化数据的库。 给定一些示例网页和要提取的数据,就为所有相似的...要在任何平台上进行抓取安装,请使用:pip install scrapely如果您使用的是Ubuntu(9.10或更高版本),
  • wince下定时抓取屏幕,保存为图片 wince下定时抓取屏幕,保存为图片
  • // 设置WebView是否使用其内置的变焦机制,该机制集合屏幕缩放控件使用,默认是false,不使用内置变焦机制。 mWebView .getSettings().setBuiltInZoomControls( true ); // 设置是否开启DOM存储API权限,默认...
  • 五种屏幕抓取方法

    千次阅读 2013-11-01 09:21:26
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ... ...今天处理word发现自己最简单的word处理有些都不知道怎么办,想抓取适当的界面就是不知道怎么办,再网上查了半天终于搞定了,现在与网

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,824
精华内容 8,729
关键字:

屏幕动态数据抓取