精华内容
下载资源
问答
  • 网页动态抓取

    2018-03-21 16:34:59
    动态抓取网页内容,生成word文件,包含具体demo和所需jar包
  • 动态抓取:目前仅适用于UnSplash的动态Web抓取脚本
  • SDK 屏幕动态抓取

    2013-08-20 09:26:42
    用C++写的屏幕动态抓取程序,看到有很多截图保存BMP的程序。。这个动态的仅供大家学习。
  • Java基于Selenium动态抓取页面前情介绍解决思路 前情介绍 前段时间开发了一个功能,通过HttpClient访问某个页面,获取页面的全部内容;之后通过抓取过来的整个页面展示在自己的网页中;但是过了一段时间之后,网页...

    前情介绍

    前段时间开发了一个功能,通过HttpClient访问某个页面,获取页面的全部html内容;之后通过抓取过来的整个页面展示在自己的网页中;但是过了一段时间之后,网页升级了,网页中的图片都变成了动态加载,直接通过HttpClient无法获取完整的页面内容,图片都是懒加载状态无法展示正确内容。

    解决

    思路

    既然没办法直接抓取静态页面,那么可以尝试动态抓取页面;如何抓取动态页面呢,本文里采用了Selenium进行动态抓取页面。通过Selenium模拟正常打开一个浏览器,浏览网页的过程,当浏览到页面的最下方整个页面加载完毕,此时再抓取整个网页的内容就可以完整的获取页面内容。
    Selenium的WebDriver可以模拟不同浏览器,本文采用的是Chrome浏览器,其他支持的浏览器大家可以通过查看WebDriver的实现类来获得答案。

    编码

    引用Selenium库的jar包

    	<dependency>
    		<groupId>org.seleniumhq.selenium</groupId>
    		<artifactId>selenium-java</artifactId>
    		<version>3.141.59</version>
    	</dependency>
    

    因为要模拟Chrome浏览器,所以要下载chromedriver,到这基础的工作就做完了,接下来是开发代码。废话不多说,直接上代码。

    public String selenium(String url) throws InterruptedException {
            // 设置 chromedirver 的存放位置
            System.getProperties().setProperty("webdriver.chrome.driver", "D:/lingy/chromedriver_win32/chromedriver.exe");
            // 设置无头浏览器,这样就不会弹出浏览器窗口
            ChromeOptions chromeOptions = new ChromeOptions();
            chromeOptions.addArguments("--headless");
            Long scrollSize = 1000L;
            WebDriver webDriver = new ChromeDriver(chromeOptions);
            webDriver.get(url);
            //设置浏览器的宽高
            Dimension dimension = new Dimension(1000, scrollSize.intValue());
            webDriver.manage().window().setSize(dimension);
            String html = "";
            //获取JS执行器,可以执行js代码来控制页面
            JavascriptExecutor driver_js= ((JavascriptExecutor) webDriver);
            //获取页面的高度
            Long scrollHeight = (Long) driver_js.executeScript("return document.body.scrollHeight");
            logger.info("article hight is : {}",scrollHeight);
            //因为要模拟鼠标滚动浏览网页的效果,所以设置了每次滚动的高度,然后通过整个页面的高度计算出股东的次数
            Long loopNum = scrollHeight/scrollSize;
            loopNum = loopNum+1;
            logger.info("page need scroll times : {}",loopNum);
            for(int i =0 ; i < loopNum; i++){
                Long start = i*scrollSize;
                Long end = (i+1)*scrollSize;
                //根据滚动的次数,依次滚动页面,为了图片能加载完全,停留1秒钟
                driver_js.executeScript("scroll("+start+","+end+")");
                Thread.sleep(1000);
            }
            //返回页面全部内容
            html = (String)driver_js.executeScript("return document.documentElement.outerHTML");
            webDriver.close();
            return html;
    }
    

    到此就可以完整的获取整个页面的内容了,但是这样获取原汁原味的内容,不一定能很好的展示在我们自己的页面上,下面是实际操作中遇到的两个问题。

    解决过程中遇到的问题一

    在展示抓取内容的过程中遇到图片跨域显示的或者防盗链的问题。刚开始的解决思路是通过Nginx反向代理的方式,来代理图片URL,但是因为源网页图片防盗链或者其他原因无法进行代理;
    所以我用另外一种方式,通过将图片转换成Base64格式的内容替换原来的url来解决,这种方式确实可以解决这个问题但会引出新的问题,图片转换成Base64之后会将原网页内容变得非常大,在存储和展示过程中请求非常消耗存储空间和请求时间。
    最后,我选择了将图片读取到本地,在通过Nginx代理的方式来处理。

    		//获取网页图片元素
            List<WebElement> imgList = webDriver.findElements(By.tagName("img"));
    //        data:image/gif;base64,
            for(WebElement img : imgList){
                String imgSrc = img.getAttribute("src");
                logger.info("img's src is : {}",imgSrc);
                String pattern = "^((http)|(https)).*";
                boolean imgSrcPattern = !StringUtils.isEmpty(imgSrc) && Pattern.matches(pattern, imgSrc);
                if(imgSrcPattern){
    //                String strNetImageToBase64 = changImgUrlToBase64(imgSrc);
    //                driver_js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])", img, "src", "data:image/png;base64,"+strNetImageToBase64);
                    String imgUrlToImgFile = changImgUrlToImgFile(imgSrc);
    				//通过JS来替换页面图片
    				driver_js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])", img, "src", imgUrlToImgFile);
                }
            }
    

    关键代码: driver_js.executeScript("arguments[0].setAttribute(arguments[1],arguments[2])", img, "src", imgUrlToImgFile);

    将图片转换成Base64的代码

    	private String changImgUrlToBase64(String imgSrc){
            String strNetImageToBase64 = "";
            try {
                URL imgURL = new URL(imgSrc);
                final HttpURLConnection conn = (HttpURLConnection) imgURL.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(3000);
                InputStream is = conn.getInputStream();
                ByteArrayOutputStream data = new ByteArrayOutputStream();
                // 将内容读取内存中
                final byte[] by = new byte[1024];
                int len = -1;
                while ((len = is.read(by)) != -1) {
                    data.write(by, 0, len);
                }
                // 对字节数组Base64编码
                BASE64Encoder encoder = new BASE64Encoder();
                strNetImageToBase64 = encoder.encode(data.toByteArray());
                // 关闭流
                is.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return strNetImageToBase64;
        }
    

    将图片下载到本地的代码

    	private static String changImgUrlToImgFile(String imgSrc){
            String suffix = ".png";
            if(imgSrc.indexOf("gif") != -1){
                suffix = ".gif";
            }else if(imgSrc.indexOf("jpg") != -1){
                suffix = ".jpg";
            }else if(imgSrc.indexOf("jpeg") != -1){
                suffix = ".jpeg";
            }else if(imgSrc.indexOf("png") != -1){
                suffix = ".png";
            }
            String dir = "E:/lingy/asmImg/";
            String fileName = System.currentTimeMillis()+suffix;
            try {
                URL imgURL = new URL(imgSrc);
                final HttpURLConnection conn = (HttpURLConnection) imgURL.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(3000);
                InputStream is = conn.getInputStream();
                File imgFile = new File(dir+fileName);
                if(!imgFile.exists()){
                    imgFile.createNewFile();
                }
    //            FileOutputStream fos = new FileOutputStream(imgFile);
    //            final byte[] by = new byte[1024];
    //            int len = -1;
    //            while ((len = is.read(by)) != -1) {
    //                fos.write(by, 0, len);
    //            }
    //            is.close();
    //            FileUtils.copyURLToFile(imgURL,imgFile);
                FileUtils.copyInputStreamToFile(is,imgFile);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String imagRootPath = "http://localhost/asmImg/";
            return imagRootPath + fileName;
        }
    

    解决过程中遇到的问题二

    在抓取页面过程中,由于需要模拟网页滚动浏览的效果整个抓取非常耗时(页面越长越耗时),在前端对响应时间有要求的情况下,建议大家讲抓取页面的过程做成异步的。

    总结

    Selenium更强大的用处是进行自动化测试,模拟浏览器行为,操作页面元素等;自动化测试领域更加专业,这里不做深入的探讨,只是简单的介绍一下如何动态抓取一个的过程。其中的关键是获取页面元素执行JS脚本,主要使用webDriver.findElements()driver_js.executeScript()两个方法。由于上边的介绍只是一个简单的尝试,其他场景中会遇到更复杂的情况,比如说有的页面需要点击一下才能展示全部内容,这就需要调用js去触发。
    以上就是本次解决问题的一个回顾,希望能给大家带来一定的思路和帮助。

    展开全文
  • python动态抓取代理IP

    千次阅读 2017-02-14 14:26:17
    python动态抓取代理IP #!/usr/bin/python # -*- coding: UTF-8 -*- #print("Hello, World!"); #python动态抓取代理IP:代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个...

    python动态抓取代理IP


    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    #print("Hello, World!");
    #python动态抓取代理IP:代理获取的相关代码,目前抓取了快代理、代理66、有代理、西刺代理、guobanjia这个五个网站的免费代理
    #author:zjcjava@163.com 2016-11-02
    import urllib.parse
    import urllib.request
    import time
    from lxml import etree
    
    #可写函数说明
    def printinfo( name, age ):
       "打印任何传入的字符串"
       print ("Name: ", name);
       print ("Age ", age);
       return;
     
    #调用printinfo函数
    printinfo( age=50, name="miki" );
    
    global url_path
    url_path = [3]
    
    def get_url(url):    #国内高匿代理的链接
        url_path [0] = url
        url_list = []
        if "xici" in url:
            for i in range(1,1000):
                url_new = url + str(i)
                url_list.append(url_new)
        if "66" in url:
            for i in range(1,2):
                url_new = url + str(i)+".html"
                url_list.append(url_new)
        print(url_new)
        return url_list
    
    def get_content(url):     # 获取网页内容
        user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
        headers = {'User-Agent': user_agent}
        req = urllib.request.Request(url=url, headers=headers)
        res = urllib.request.urlopen(req)
        content = res.read()
        return content #.decode('utf-8')
    
    
    
    def get_info(content,url):      # 提取网页信息 / ip 端口
        print("111111111111111111");
        print("sss:"+url)
        if "xici" in url:
            datas_ip = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[2]/text()')
            datas_port = etree.HTML(content).xpath('//table[contains(@id,"ip_list")]/tr/td[3]/text()')
        if "66" in url:
            print(66);
            datas_ip = etree.HTML(content).xpath('//div[contains(@id,"main")]/div/div[1]/table/tr[position()>1]/td[1]/text()')
            datas_port = etree.HTML(content).xpath('//div[contains(@id,"main")]/div/div[1]/table/tr[position()>1]/td[2]/text()')
            #print('%s : %s'%(datas_ip,datas_port))
        
        with open("temp.txt", "w") as fd:
            for i in range(0,len(datas_ip)):
                out = u""
                out += u"" + datas_ip[i]
                out += u":" + datas_port[i]
                fd.write(out + u"\n")     # 所有ip和端口号写入data文件
    
    def verif_ip(ip,port):    # 验证ip有效性
        user_agent ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
        headers = {'User-Agent':user_agent}
        proxy = {'http':'http://%s:%s'%(ip,port)}
        print(proxy)
    
        proxy_handler = urllib.request.ProxyHandler(proxy)
        opener = urllib.request.build_opener(proxy_handler)
        urllib.request.install_opener(opener)
    
        test_url = "https://www.baidu.com/"
        req = urllib.request.Request(url=test_url,headers=headers)
        time.sleep(6)
        try:
            res = urllib.request.urlopen(req)
            time.sleep(3)
            content = res.read()
            if content:
                print('that is ok')
                with open("data.txt", "a") as fd:       # 有效ip保存到data2文件夹
                    fd.write(ip + u":" + port)
                    #fd.write("\n")
            else:
                print('its not ok')
        except urllib.request.URLError as e:
            print(e.reason)
    
    # url_list =get_url(url="http://www.xicidaili.com/nn/");
    # for i in url_list:
    #         print(i)
    #url = 'http://www.xicidaili.com/nn/'
    if __name__ == "__main__":
        global url_path
        url = 'http://www.66ip.cn/'
        url_list = get_url(url)
        for i in url_list:
            print(i)
            content = get_content(i)
            time.sleep(3)
            get_info(content,url);
    
    
    file = open("temp.txt")
    while 1:
        lines = file.readlines(100000)
        if not lines:
            break
        for data in lines:
            print(data.split(u":")[0])
            #out=data.split(u":");
    		#print('%s : %s'%(data.split(u":")[0],data.split(u":")[0]))
            verif_ip(data.split(u":")[0],data.split(u":")[1])
    
    







    展开全文
  • 这是本人自己研究的动态抓取网上小说c#实例代码,无数据库操作,下载即可用VS工具运行,代码简洁明了,可自己进行编辑扩展,方便大家看小说无广告(备注:下载后可点击首页“护花高手在都市”此小说可全部阅读,其他...
  • 及稳定抓取功能为目标,以期通过一种基于触觉传感器信息反馈的动态抓取控 制方法改善假手的操作性能。主要研究内容包括:仿人型假手嵌入式控制系统 的研制、指尖三维力触觉传感器以及静态性能、假手自适应阻抗力跟踪...
  • 本人在做网页抓取程序,由于抓取的内容,源代码里是看不到的, 用WINFORM是可以用WebBrowser这样实现的。。我想知道用ASP.NET的话,有没有能达到这个效果的方法, 我试了 HttpWebRequest,, 但是没找到操作DOM元素...
  • python-动态抓取视频

    千次阅读 2019-02-20 17:39:11
  • #资源达人分享计划#
  • #资源达人分享计划#
  • #资源达人分享计划#
  • Selenium+ChromeDriver动态抓取网页元素

    千次阅读 2017-03-18 13:29:23
    1、安装 chrome 浏览器(chrome和chromedriver都下载最新版安装可以避免很多问题) 2、下载 chromedriver地址(这个需要翻墙):code.... org.seleniumhq.selenium selenium-java ${org.seleniumhq.selenium.vers

    1、安装 chrome 浏览器(chrome和chromedriver都下载最新版安装可以避免很多问题)
    2、下载 chromedriver地址(这个需要翻墙):code.google.com/p/chromedriver

    3、maven pom.xml

    org.seleniumhq.selenium
    selenium-java
    ${org.seleniumhq.selenium.version}

    4、java代码
    //设置chrome driver地址
    File file_chrome = new File(App.CHROME_DRIVER);
    System.setProperty(“webdriver.chrome.driver”, file_chrome.getAbsolutePath());
    //设置chrome浏览器地址
    ChromeOptions options = new ChromeOptions();
    options.setBinary(App.CHROME_APPLICATION);
    webDriver = new ChromeDriver(options);
    //打开浏览器
    WebDriver webDriver.get(App.BASE_URL+videoModel.getPlayUrl());
    //找到元素
    WebElement videoPlayer = webDriver.findElement(By.id(“video_player”));
    //找元素下的元素
    WebElement video = videoPlayer.findElement(By.tagName(“video”));
    //读取attr
    String downloadUrl = video.getAttribute(“src”);

    展开全文
  • winfrom动态抓取网页数据

    千次阅读 2017-03-13 17:32:14
    id重复,访问频次校验,js加密压缩,302跳转,多域名配置,非常规命名,重复混淆节点等等,常规市面上的手段基本都搞了(当然,我们可以通过获取到302跳转的网址,然后再抓取,是没有问题的,这里介绍非常规手法)。...
  • #资源达人分享计划#
  • 想要在MySQL 5.1以下的版本中动态抓取提交到MySQL中的查询日志,可以采用tcpdump的方法,大致如下: tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|...
  • #资源达人分享计划#
  • 从网站上动态抓取内容的大概思路

    千次阅读 2018-06-15 13:07:25
    大致抓取分为两类一、网站源码中包含目标的内容解决办法:1.直接通过代码通过URL,模拟浏览器请求服务器2.用Jsoup去解析服务器返回的文件3.获得目标信息二、目标内容包含在JavaScript请求的返回结果中解决办法1.通过...
  • 就比如有一个彩票开奖的网站,每五分钟开一次奖,我可以抓取到它的前三次开奖的结果吗?还有他的开奖剩余时间
  • 真的是很久没有更新我的博客了,刚开始,我还真的不知道爬虫是什么东西,但是由于项目需要,老板要我做个简单的爬虫,就是去人家的微信公众号去把里面的文章动态抓取下来,当听到这个事情的时候,我是激动的,因为...
  • Python爬虫之selenium+chrome实现动态页面爬取 本文主要介绍python+selenium+chromedriver的组合运用,实现浏览器爬虫。 1.Selenium的介绍 Selenium是一个用于web应用程序测试的工具。Selenium测试直接运行在浏览器...
  • 它使用Yelp,Google Maps和Alchemy Labs API,并动态抓取要通过情感分析进行评分的评论文本内容,以生成第三分。 在建立第三得分的数据管道时,由于API速率限制,每个位置的动态第三得分当前不可用。 在我学习...
  • [mac@macdeMacBook-Pro ~]$adb devices List of devices attached 6eafb6ef device
  • selenium动态抓取页面元素

    千次阅读 2011-01-19 16:09:00
    在测试拍客的时候发现,有时候需要删除,转发拍客,a标签属性id,name都是动态变化的,和发的拍客id有关系,这样测试的时候,就不太方便,总是要去变化id,不然就会报:Element is not found了。  ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,982
精华内容 25,192
关键字:

动态抓取