精华内容
下载资源
问答
  • 谈如何解析Html抓取数据.pdf
  • 主要介绍了c#远程html数据抓取的方法,大家参考使用吧
  • java解析html抓取网站数据采集网站信息
  • 谈如何解析Html抓取数据

    万次阅读 2015-03-28 23:13:52
    最近加入了一家新公司,他们是一家电商,业务是网上虚拟充值,我进去是做OA里面的财务,本来想到的是做一做信息管理的,没想到还涉及到去别的网站采集数据(解析Html,最终用采集到的数据生成财务凭证)这一环,这个...

    最近加入了一家新公司,他们是一家电商,业务是网上虚拟充值,我进去是做OA里面的财务,
    本来想到的是做一做信息管理的,没想到还涉及到去别的网站采集数据(解析Html,
    最终用采集到的数据生成财务凭证)这一环,这个是我从未接触过的领域,
    大致看了一下,目的也就是解析网页的HTML从中找出需要的数据。
    那么问题来了,该怎样找到这些信息?

    由于实质就是在一堆文本里面“挖出”你要的东西,比如网页里面的Title的文本,
    很多人自然的会想到正则表达式,呵呵,这个不是不行,而是太费劲了。想想看,
    HTML的实质是什么?不就是一堆标签嘛,再往深了想,它就是XML的子集,
    XML是可以用XPath还可以用Linq To XML。起初我就想,看有没有Linq To HTML的实现,
    还真让我找到一个。用天朝的Baidu搜到的,真不容易,
    点这里
    看看资料,真的很少,说明并不多,没敢用。
    在网上流传最多的解析HTML的库是一个叫Html Agility Pack的东西,
    并用它还可以使用Nuget方便的引用到项目中去,真是太省心了!官网源码

    看了Html Agility Pack的简单介绍,它是用XPath的语法去检索HTML元素的,这样已经算够方便了吧?还不够好!比如我要找一个Div,我只能通过索引找,如html/body/div[4],不爽吧?感觉还是不够灵活,经过一番搜索,又找到了一个好东西ScrapySharp,看看它是如何检索HTML元素的

    ScrapingBrowser browser = new ScrapingBrowser();
    
    //set UseDefaultCookiesParser as false if a website returns invalid cookies format
    //browser.UseDefaultCookiesParser = false;
    
    WebPage homePage = browser.NavigateToPage(new Uri("http://www.bing.com/"));
    
    PageWebForm form = homePage.FindFormById("sb_form");
    form["q"] = "scrapysharp";
    form.Method = HttpVerb.Get;
    WebPage resultsPage = form.Submit();
    
    HtmlNode[] resultsLinks = resultsPage.Html.CssSelect("div.sb_tlst h3 a").ToArray();
    
    WebPage blogPage = resultsPage.FindLinks(By.Text("romcyber blog | Just another WordPress site")).Single().Click()

    再看一段

    using System.Linq;
    using HtmlAgilityPack;
    using ScrapySharp.Extensions;
    
    class Example
    {
        public void Main()
        {
            var divs = html.CssSelect(“div”);  //all div elements
            var nodes = html.CssSelect(“div.content”); //all div elements with css classcontent
            var nodes = html.CssSelect(“div.widget.monthlist”); //all div elements with the both css class
            var nodes = html.CssSelect(“#postPaging”); //all HTML elements with the id postPaging
            var nodes = html.CssSelect(“div#postPaging.testClass”); // all HTML elements with the id postPaging and css class testClass
    
            var nodes = html.CssSelect(“div.content > p.para”); //p elements who are direct children of div elements with css classcontent
    
            var nodes = html.CssSelect(“input[type=text].login”); // textbox with css class login
        }
    }

    这不就是CSS选择器吗?乖乖,把Jquery那一套学着了,必须赞一个啊~!
    我也找到一篇HTML Agility Pack 搭配 ScrapySharp,彻底解除Html解析的痛苦
    两个一配合着用,如虎添翼~!

    展开全文
  • C# 远程HTML数据抓取

    2010-03-26 09:57:50
    C# 远程获取HTML代码,并通过正则表达式取得所需数据
  • C#抓取数据程序源码 源码描述: 源码示例抓取界面http://detail.zol.com.cn/cell_phone_index/subcate57_98_list_1.html 抓取信息:图片,手机名称,价格,网络模式,网络类型,其它信息不要 手机图片要下载下来 ...
  • 最近做了一个从网络上抓取数据的一个小程序。主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中。 也找了一些资料,觉得没有一个很好的,全面的例子。因此在这里做个笔记提醒自己。 首先需要.....

    非常感谢https://www.cnblogs.com/puqiuxiaomao/p/4037918.html

    网络爬虫技术学习,更多知识请访问https://www.itkc8.com

     

    最近做了一个从网络上抓取数据的一个小程序。主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中。

    也找了一些资料,觉得没有一个很好的,全面的例子。因此在这里做个笔记提醒自己。

    首先需要一个jsoup的jar包,我用的1.6.0。。下载地址为:http://pan.baidu.com/s/1mgqOuHa

    1,获取网页内容(核心代码,技术有限没封装)。

    2,登录之后抓取网页数据(如何在请求中携带cookie)。

    3,获取网站的ajax请求方法(返回json)。

    以上这三点我就用一个类全部包含(比较糙望见谅,直接copy代码过去,应该就可以用)

    一,这个类分别有这上面的1,2,3三中方法,直接main方法可以进行测试

    复制代码

    package com.minxinloan.black.web.utils;
    
    import java.io.BufferedReader;
    import java.io.ByteArrayOutputStream;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    import java.net.URLEncoder;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.StringTokenizer;
    
    import net.sf.json.JSONArray;
    import net.sf.json.JSONObject;
    
    import org.jsoup.Connection;
    import org.jsoup.Connection.Method;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    public class CookieUtil {
    
        public final static String CONTENT_TYPE = "Content-Type";
    
        public static void main(String[] args) {
            
            //String loginURL = "http://www.p2peye.com/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=Lsc66&username=puqiuxiaomao&password=a1234567";
            String listURL = "http://www.p2peye.com/blacklist.php?p=2";
            String logURL = "http://www.p2peye.com/member.php";
    
    
            //********************************需要登录的*************************************************
            try {
                    Connection.Response  res = 
                            Jsoup.connect(logURL)
                                .data("mod","logging"
                                        ,"action","login"
                                        ,"loginsubmit","yes"
                                        ,"loginhash","Lsc66"
                                        ,"username","puqiuxiaomao"
                                        ,"password","a1234567")
                                .method(Method.POST)
                                .execute();
                    
                    
                    //这儿的SESSIONID需要根据要登录的目标网站设置的session Cookie名字而定
                    Connection con=Jsoup.connect(listURL);
                    //设置访问形式(电脑访问,手机访问):直接百度都参数设置
                    con.header("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)");
                    //把登录信息的cookies保存如map对象里面
                    Map <String,String>  map=res.cookies();
                    Iterator<Entry<String,String>> it =map.entrySet().iterator();
                    while(it.hasNext()){
                        Entry<String,String> en= it.next(); 
                        //把登录的信息放入请求里面
                        con =con.cookie(en.getKey(), en.getValue());
                        
                    }
                    //再次获取Document对象。
                    Document objectDoc = con.get();
                    
                    Elements elements = objectDoc.getAllElements();//获取这个连接返回页面的源码内容(不是源码跟源码差不多)
                    for (Element element : elements) {
                        //element是迭代出来的标签:如:<div><span></span></div>
                        Elements elements2= element.getAllElements();//
                         for (Element element2 : elements2) {
                             element2.text();
                             element2.attr("href");//获取标签属性。element2代表a标签:href代表属性
                             element2.text();//获取标签文本
                        }
                    }
                    
                    //********************************不需要登录的*************************************************
                    
                    String URL = "http://www.p2peye.com/blacklist.php?p=2";
                    Document conTemp = Jsoup.connect(URL).get();
                    Elements elementsTemps = conTemp.getAllElements();
                     for (Element elementsTemp : elementsTemps) {
                         elementsTemp.text();
                         elementsTemp.attr("href");//获取标签属性。element2代表a标签:href代表属性
                         elementsTemp.text();//获取标签文本
                    }
                    
                    
                    //********************************ajax方法获取内容。。。*************************************************。
                     HttpURLConnection connection = null;
                        BufferedReader reader = null;
                        try {
                            StringBuffer sb = new StringBuffer();
                            URL getUrl = new URL(URL);
                            connection = (HttpURLConnection)getUrl.openConnection();
                            reader = new BufferedReader(new InputStreamReader(
                                    connection.getInputStream(),"utf-8"));
                            String lines;
                            while ((lines = reader.readLine()) != null) {
                                sb.append(lines);
                            };
                            List<Map<String, Object>> list = parseJSON2List(sb.toString());//json转换成list
                        } catch (Exception e) {
                            
                        } finally{
                            if(reader!=null)
                                try {
                                    reader.close();
                                } catch (IOException e) {
                                }
                            // 断开连接
                            connection.disconnect();
                        }
                    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
    
        public static Map<String, Object> parseJSON2Map(String jsonStr){  
            Map<String, Object> map = new HashMap<String, Object>();  
            //最外层解析  
            JSONObject json = JSONObject.fromObject(jsonStr);  
            for(Object k : json.keySet()){  
                Object v = json.get(k);   
                //如果内层还是数组的话,继续解析  
                if(v instanceof JSONArray){  
                    List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
                    Iterator<JSONObject> it = ((JSONArray)v).iterator();  
                    while(it.hasNext()){  
                        JSONObject json2 = it.next();  
                        list.add(parseJSON2Map(json2.toString()));  
                    }  
                    map.put(k.toString(), list);  
                } else {  
                    map.put(k.toString(), v);  
                }  
            }  
            return map;  
        }  
        
        public static List<Map<String, Object>> parseJSON2List(String jsonStr){  
            JSONArray jsonArr = JSONArray.fromObject(jsonStr);  
            List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();  
            Iterator<JSONObject> it = jsonArr.iterator();  
            while(it.hasNext()){  
                JSONObject json2 = it.next();  
                list.add(parseJSON2Map(json2.toString()));  
            }  
            return list;  
        }  
        
        
    
    }

    复制代码

    二,这个是获取验证码的类,可以研究下。(但你要要分析出网站的验证码的请求地址)

    复制代码

    package com.minxinloan.black.web.utils;
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    import java.nio.charset.Charset;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.StringTokenizer;
    
    public class Utils {//解析验证码的
        public static Content getRandom(String method, String sUrl,// 要解析的url
                Map<String, String> paramMap, // 存放用户名和密码的map
                Map<String, String> requestHeaderMap,// 存放COOKIE的map
                boolean isOnlyReturnHeader, String path) {
    
            Content content = null;
            HttpURLConnection httpUrlConnection = null;
            InputStream in = null;
            try {
                URL url = new URL(sUrl);
                boolean isPost = "POST".equals(method);
                if (method == null
                        || (!"GET".equalsIgnoreCase(method) && !"POST"
                                .equalsIgnoreCase(method))) {
                    method = "POST";
                }
                URL resolvedURL = url;
                URLConnection urlConnection = resolvedURL.openConnection();
                httpUrlConnection = (HttpURLConnection) urlConnection;
                httpUrlConnection.setRequestMethod(method);
                httpUrlConnection.setRequestProperty("Accept-Language",
                        "zh-cn,zh;q=0.5");
                // Do not follow redirects, We will handle redirects ourself
                httpUrlConnection.setInstanceFollowRedirects(false);
                httpUrlConnection.setDoOutput(true);
                httpUrlConnection.setDoInput(true);
                httpUrlConnection.setConnectTimeout(5000);
                httpUrlConnection.setReadTimeout(5000);
                httpUrlConnection.setUseCaches(false);
                httpUrlConnection.setDefaultUseCaches(false);
                httpUrlConnection.connect();
    
                int responseCode = httpUrlConnection.getResponseCode();
    
                if (responseCode == HttpURLConnection.HTTP_OK
                        || responseCode == HttpURLConnection.HTTP_CREATED) {
                    byte[] bytes = new byte[0];
                    if (!isOnlyReturnHeader) {
                        DataInputStream ins = new DataInputStream(
                                httpUrlConnection.getInputStream());
                        // 验证码的位置
                        DataOutputStream out = new DataOutputStream(
                                new FileOutputStream(path + "/code.bmp"));
                        byte[] buffer = new byte[4096];
                        int count = 0;
                        while ((count = ins.read(buffer)) > 0) {
                            out.write(buffer, 0, count);
                        }
                        out.close();
                        ins.close();
                    }
                    String encoding = null;
                    if (encoding == null) {
                        encoding = getEncodingFromContentType(httpUrlConnection
                                .getHeaderField(""));
                    }
                    content = new Content(sUrl, new String(bytes, encoding),
                            httpUrlConnection.getHeaderFields());
                }
            } catch (Exception e) {
                return null;
            } finally {
                if (httpUrlConnection != null) {
                    httpUrlConnection.disconnect();
                }
            }
            return content;
        }
    
        public static String getEncodingFromContentType(String contentType) {
            String encoding = null;
            if (contentType == null) {
                return null;
            }
            StringTokenizer tok = new StringTokenizer(contentType, ";");
            if (tok.hasMoreTokens()) {
                tok.nextToken();
                while (tok.hasMoreTokens()) {
                    String assignment = tok.nextToken().trim();
                    int eqIdx = assignment.indexOf('=');
                    if (eqIdx != -1) {
                        String varName = assignment.substring(0, eqIdx).trim();
                        if ("charset".equalsIgnoreCase(varName)) {
                            String varValue = assignment.substring(eqIdx + 1)
                                    .trim();
                            if (varValue.startsWith("\"")
                                    && varValue.endsWith("\"")) {
                                // substring works on indices
                                varValue = varValue.substring(1,
                                        varValue.length() - 1);
                            }
                            if (Charset.isSupported(varValue)) {
                                encoding = varValue;
                            }
                        }
                    }
                }
            }
            if (encoding == null) {
                return "UTF-8";
            }
            return encoding;
        }
    
        // 这个是输出
        public static boolean inFile(String content, String path) {
            PrintWriter out = null;
            File file = new File(path);
            try {
                if (!file.exists()) {
                    file.createNewFile();
                }
                out = new PrintWriter(new FileWriter(file));
    
                out.write(content);
                out.flush();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                out.close();
            }
            return false;
        }
    
        public static String getHtmlReadLine(String httpurl) {
            String CurrentLine = "";
            String TotalString = "";
            InputStream urlStream;
            String content = "";
    
            try {
                URL url = new URL(httpurl);
    
                HttpURLConnection connection = (HttpURLConnection) url
                        .openConnection();
    
                connection.connect();
                System.out.println(connection.getResponseCode());
                urlStream = connection.getInputStream();
    
                BufferedReader reader = new BufferedReader(
    
                new InputStreamReader(urlStream, "utf-8"));
    
                while ((CurrentLine = reader.readLine()) != null) {
                    TotalString += CurrentLine + "\n";
                }
    
                content = TotalString;
    
            } catch (Exception e) {
            }
    
            return content;
        }
    }
    
    
    class Content {
        private String url;
        private String body;
        private Map<String, List<String>> m_mHeaders = new HashMap<String, List<String>>();
    
        public Content(String url, String body, Map<String, List<String>> headers) {
            this.url = url;
            this.body = body;
            this.m_mHeaders = headers;
        }
    
        public String getUrl() {
            return url;
        }
    
        public String getBody() {
            return body;
        }
    
        public Map<String, List<String>> getHeaders() {
            return m_mHeaders;
        }
    
    }

    网络爬虫​​​​​​​技术学习,更多知识请访问https://www.itkc8.com

    展开全文
  • 使用selenium爬虫抓取数据

    万次阅读 2018-09-19 17:45:35
    使用selenium爬虫抓取数据 文章目录使用selenium爬虫抓取数据@[toc]总体介绍Selenium安装安装火狐浏览器插件Katalon Recorder简单教程抓取网易房地产数据例子参考链接 总体介绍 Selenium 简单入门教程 使用 ...


    总体介绍

    • Selenium 简单入门教程
    • 使用 Selenium 模拟访问网易数据中心的房价数据
    • 使用 Pandas 处理数据
    • 使用 Matplotlib 绘制图表

    Selenium

    安装

    • conda install selenium 或 pip install selenium
    • 下载浏览器驱动。在 selenium 的 download 页面,Third Party Drivers 处下载对应浏览器驱动,或使用下方链接
    • Linux 和 MacOS 用户下载好之后, 将下载好的”geckodriver”文件放在你的计算机的 “/usr/bin” 或 “/usr/local/bin” 目录。并赋予执行权限,如下所示:
    sudo cp geckodriver /usr/local/bin
    sudo chmod +x /usr/local/bin/geckodriver
    

    windows用户应该是把geckodriver文件放在环境变量中(PATH),详见百度经验
    或者在代码中引用文件所在位置,如下:

     from selenium import webdriver
      path="D:\\chromedriver.exe" #替换成geckodriver实际所在目录
      driver=webdriver.Chrome(path)
      driver.get("http://www.yahoo.com")
      driver.close()
      driver.quit()
    

    安装火狐浏览器插件Katalon Recorder

    该组件用于录制用户在浏览器中的操作,并生成python等代码,省去了自己写代码的麻烦。类似按键精灵,可以参考莫烦的视频教程。

    • 工具>附加组件>搜索 Katalon Recorder >安装
    • 在需要录制的页面打开 Katalon Recorder ,点击录制,然后完成你想录制的操作,点击停止录制,导出代码。例如我在百度搜索框中输入“P2P”,然后点击搜索,录制得到的代码如下:
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import Select
    from selenium.common.exceptions import NoSuchElementException
    from selenium.common.exceptions import NoAlertPresentException
    import unittest, time, re
    
    class UntitledTestCase(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(30)
            self.base_url = "https://www.katalon.com/"
            self.verificationErrors = []
            self.accept_next_alert = True
        
        def test_untitled_test_case(self):
            driver = self.driver
            driver.get("https://www.baidu.com/")
            driver.find_element_by_id("kw").click()
            driver.find_element_by_id("kw").clear()
            driver.find_element_by_id("kw").send_keys("P2P")
            driver.find_element_by_id("su").click()
        
        def is_element_present(self, how, what):
            try: self.driver.find_element(by=how, value=what)
            except NoSuchElementException as e: return False
            return True
        
        def is_alert_present(self):
            try: self.driver.switch_to_alert()
            except NoAlertPresentException as e: return False
            return True
        
        def close_alert_and_get_its_text(self):
            try:
                alert = self.driver.switch_to_alert()
                alert_text = alert.text
                if self.accept_next_alert:
                    alert.accept()
                else:
                    alert.dismiss()
                return alert_text
            finally: self.accept_next_alert = True
        
        def tearDown(self):
            self.driver.quit()
            self.assertEqual([], self.verificationErrors)
    
    if __name__ == "__main__":
        unittest.main()
    
    

    其中,以下内容是与我们的操作相关的代码

    def test_untitled_test_case(self):
            driver = self.driver
            driver.get("https://www.baidu.com/")              #打开百度搜索页面
            driver.find_element_by_id("kw").click()          #点击搜索输入框,这个在写代码时可以不要
            driver.find_element_by_id("kw").clear()         #清空里面已有的输入
            driver.find_element_by_id("kw").send_keys("P2P")    #在里面输入P2P搜索词
            driver.find_element_by_id("su").click()          #点击搜索按钮
    

    后台运行

    • 安装PhantomJs,见参考链接
    • driver = webdriver.PhantomJS()

    简单教程

    • 连接浏览器,以火狐Firefox浏览器为例
    from selenium import webdriver
    self.driver = webdriver.Firefox()
    
    • 打开某个页面
    driver.get("https://www.baidu.com/")
    
    • 等待具有某个ID的元素加载完成,这用来保证页面以及加载出来
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
    from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw"))) #这是百度输入框的ID
    

    获取输入框ID可以使用Firefox或Chrome浏览器的提供的调试工具,对于Firefox浏览器,在页面右键选择“查看元素”即可打开调试页面,点击调试页面左上角的“选择一个元素”按钮,再点击百度的输入框,可以在下方看到它的ID为“kw”

    • 使用前面我们录制得到的代码实现自动输入搜索词
    driver.find_element_by_id("kw").clear()         #清空里面已有的输入
    driver.find_element_by_id("kw").send_keys("P2P")    #在里面输入P2P搜索词
    driver.find_element_by_id("su").click()          #点击搜索按钮
    
    • 通过“审查元素”分析,我们发现百度搜索得到的每个词条的class属性都为result c-container,通过这个,我们可以得到所有搜索结果
    e_item = driver.find_elements_by_xpath('//div[@class="result c-container "]')
    print('\n'.join([e.find_element_by_tag_name('a').text for e in e_item])) #打印每个条目的内容
    

    结果如下:

    【网贷之家】中国首家权威p2p网贷投资理财行业门户_网贷理财_p2p…
    P2P平台被清盘后,你会怎样捍卫自身利益?
    P2P金融_百度百科
    P2psearcher绿色版下载_P2psearcher免安装版官方下载-华军软件园
    国家出手,P2P现回暖迹象!
    迪蒙–供应链金融、黄金理财、融资租赁、消费金融系统专业开发商

    同样,我们也可以获得每个条目的链接,进入链接即可抓取我们想要的数据

    print('\n'.join([e.find_element_by_tag_name('a').get_attribute('href') for e in e_item]))
    

    结果如下:

    http://www.baidu.com/link?url=80_XPZ-NHHGGwNmIpG5kNuAn0b8MKU5rHrdy-dJXwvy
    http://www.baidu.com/link?url=Vik9gXKc-hz-tGHQ1JcsRVzCn7vXRMr_HXNuuYa_sc_4o_Epq6Z7v7rZeW070Orxr3rWtAnAz44FR9vZSDtzcykS7WzmdI_JGfml2jERU
    http://www.baidu.com/link?url=sq7r9PEl1YjbGpDFNQKauiE21G7wKHYK9PpL1gRG6j6OPEpPrDXmTVbaO0ExdCoevQVaZzjqbvm0Pe_c1p_DHigIukY5n_-yr784N6ulcQC
    http://www.baidu.com/link?url=tXD8qkEJClA6bqXKjIq0Zg9gICFvKaC6QgCpE1FGn1xnXXd_8UAfGrNRLvH1cX-PMdkJ15mhnMUJzld1R_-vc_
    http://www.baidu.com/link?url=Jd1r4dPGnyYHxC9VuhtzWQFV3-Je4WzLC0UZJqdMJQT1ExBYOuBDI5mpRKDIT5lV564GTSe1Xw_3ZRqxjVI6UDU0SKh-spSslgiLGgsie0C
    http://www.baidu.com/link?url=ONtuKqNGH5M2PCqcEJ9AuQMLfWpoq8KTVMmY9mKLjya

    • 抓完一页的结果之后,再翻到下一页
    driver.find_element_by_xpath(u"//div[@id='page']/descendant::span[text()='2']").click() #其中2为页码,可以依次换成其他页码
    
    • 完整代码如下:
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
    from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
    driver = webdriver.Firefox()
    driver.get("https://www.baidu.com")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "kw")))
    driver.find_element_by_id("kw").clear()         #清空里面已有的输入
    driver.find_element_by_id("kw").send_keys("P2P")    #在里面输入P2P搜索词
    driver.find_element_by_id("su").click()          #点击搜索按钮
    
    for i in range(2,5,1):
        time.sleep(1)
        e_item = driver.find_elements_by_xpath('//div[@class="result c-container "]')
        print('\n'.join([e.find_element_by_tag_name('a').text for e in e_item]))
        driver.find_element_by_xpath(f"//div[@id='page']/descendant::span[text()='{i}']").click()
            
    driver.quit()
    

    结果如下:

    【网贷之家】中国首家权威p2p网贷投资理财行业门户_网贷理财_p2p…
    P2P金融_百度百科
    P2psearcher绿色版下载_P2psearcher免安装版官方下载-华军软件园
    P2P | 异次元软件世界
    迪蒙–供应链金融、黄金理财、融资租赁、消费金融系统专业开发商
    P2P“大崩盘”:上百家平台爆雷 众多投资人卷入其中|P2P…_新浪科技
    一周40家P2P“爆雷”,一旦踩雷就血本无归? | 小巴问大…_搜狐财经
    p2p有哪些公司_网贷天眼
    P2P“大崩盘”:上百家平台爆雷 众多投资人卷入其中|P2P…_新浪科技
    世上再无P2P-虎嗅网
    网贷天眼-你的互联网金融理财助手_P2P网贷理财
    互联网p2p理财网贷平台_P2P投资理财专家_现金万家P2P投资理财网
    半个月超40家平台"爆雷" P2P行业发生了什么事_网易科技
    【你我贷官网】平稳运营7年有余的P2P网络借贷信息中介平台,网上…
    一天17个P2P平台出问题?起码一半存在
    p2p什么时候进入中国的_网贷天眼
    红岭创投_值得信赖的P2P网贷平台_P2P个人理财平台
    红岭创投_值得信赖的P2P网贷平台_P2P个人理财平台
    对等网络_百度百科
    P2P 是什么? - 知乎
    频频爆雷背后暴露三大原因 P2P网贷行业该走向何方?互联网金融
    P2P理财_P2P理财排名_P2P网贷平台 - 融360
    P2P网贷|P2P理财|P2P贷款 - 专业的P2P网贷产品导购平台_希…_希财
    富金利_P2P平台_专业安全的P2P网贷投融资平台【唯一官网】
    P2P - 金评媒
    p2p吧-百度贴吧
    P2P | 人人都是产品经理

    抓取网易房地产数据例子

    # -*- coding: utf-8 -*-
    import os
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import Select
    from selenium.common.exceptions import NoSuchElementException
    from selenium.common.exceptions import NoAlertPresentException
    from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
    from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
    from selenium.webdriver.support import expected_conditions
    import unittest, time, re
    import pandas as pd
    
    class MyCrawler(object):
        def __init__(self):
            self.path = "/home/liucc/Workspace/Housing/data"
            
            if not os.path.exists(self.path):
                os.mkdir(self.path)
                
            self.driver = webdriver.Firefox()
            self.base_url = "http://data.house.163.com/bj/housing/trend/district/todayprice/{date:s}/{interval:s}/allDistrict/1.html?districtname={disname:s}#stoppoint"
            self.data = None 
        
        def craw_page(self,date="2014.01.01-2018.09.15",interval="month",disname="全市"):
            driver = self.driver
            url = self.base_url.format(date=date,interval=interval,disname=disname)
            print('访问网址:'+url)
            driver.get(url)
            
            try:
                # we have to wait for the page to refresh, the last thing that seems to be updated is the title
                WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "resultdiv_1")))
    
                print(driver.title)
                
                self.data = pd.DataFrame()
                
                ct = True
                while ct:
                    self.get_items_in_page(driver)
                    
                    e_pages = driver.find_elements_by_xpath('//div[@class="pager_box"]/a[@class="pager_b current"]/following::a[@class="pager_b "]')
    
                    if len(e_pages)>0:
                        next_page_num = e_pages[0].text
                        e_pages[0].click()
                        
                        #通过判断当前页是否为我们点击页面的方式来等待页面加载完成
                        WebDriverWait(driver, 10).until(
                            expected_conditions.text_to_be_present_in_element(
                                (By.XPATH, '//a[@class="pager_b current"]'),
                                next_page_num
                            )
                        )
     
                    else:
                        ct = False
                        break
                
                return self.data
                
            finally:
                driver.quit()
                
               
            
        def get_items_in_page(self,driver):
            e_tr = driver.find_elements_by_xpath("//tr[normalize-space(@class)='mBg1' or normalize-space(@class)='mBg2']")
            temp = pd.DataFrame(e_tr,columns=['web'])
            temp['时间']=temp.web.apply(lambda x:x.find_element_by_class_name('wd2').text.split(' ')[0])
            temp['套数']=temp.web.apply(lambda x:x.find_element_by_class_name('wd5').text)
            temp['均价']=temp.web.apply(lambda x:x.find_element_by_class_name('wd7').text)
            temp['去化']=temp.web.apply(lambda x:x.find_element_by_class_name('wd14').text)
            del temp['web']
            
            self.data = pd.concat([temp,self.data],axis=0)
      
    
    
    mcraw = MyCrawler()
    data = mcraw.craw_page()
    
    访问网址:http://data.house.163.com/bj/housing/trend/district/todayprice/2014.01.01-2018.09.15/month/allDistrict/1.html?districtname=全市#stoppoint
    北京全市-住宅-成交均价住宅成交数据_北京房价_网易北京房产
    
    data= data.sort_values(by='时间')
    print(data.to_string(index=False))
    
    时间    套数      均价     去化
    2014-01  4040  28,012  40.8%
    2014-02  1302  26,990  40.5%
    2014-03  4939  28,330  40.3%
    2014-04  3388  26,372  39.4%
    2014-05  3499  26,592  38.8%
    2014-06  2780  28,627  59.8%
    2014-07  3969  25,539  59.7%
    2014-08  5221  24,814  59.6%
    2014-09  3563  26,199  59.5%
    2014-10  6554  23,045  59.7%
    2014-11  8133  24,122  60.0%
    2014-12  9337  25,287  59.8%
    2015-01  7614  28,280  60.2%
    2015-02  2750  23,755  60.3%
    2015-03  2895  26,832  60.4%
    2015-04  5341  25,460  60.5%
    2015-05  5347  27,486  60.8%
    2015-06  5634  30,185  60.9%
    2015-07  9915  27,662  61.0%
    2015-08  7475  28,371  61.4%
    2015-09  5698  29,887  61.6%
    2015-10  6205  26,145  61.8%
    2015-11  4944  32,372  61.9%
    2015-12  9451  29,368  62.3%
    2016-01  4030  31,019  62.5%
    2016-02  1886  33,160  62.6%
    2016-03  4209  37,005  62.9%
    2016-04  5245  36,337  63.2%
    2016-05  4565  37,107  63.4%
    2016-06  4400  37,236  63.4%
    2016-07  6559  34,711  63.5%
    2016-08  6895  32,322  63.6%
    2016-09  4865  40,565  63.8%
    2016-10  3747  40,285  64.3%
    2016-11  2092  44,213  64.4%
    2016-12  4210  41,741  64.5%
    2017-01  2432  41,857  64.6%
    2017-02  2308  42,876  64.6%
    2017-03  2491  42,795  64.7%
    2017-04  2471  45,886  64.8%
    2017-05  2666  44,751  64.9%
    2017-06  1812  48,792  64.9%
    2017-07  1895  51,526  64.9%
    2017-08  1577  47,958  64.9%
    2017-09  1270  56,663  64.9%
    2017-10  1340  55,968  64.8%
    2017-11  2625  46,608  64.8%
    2017-12  2748  53,320  64.8%
    2018-01  1615  42,206  64.7%
    2018-02  1138  42,280  64.7%
    2018-03  1243  42,498  64.6%
    2018-04  1408  46,897  64.6%
    2018-05  3560  43,199  64.8%
    2018-06  1884  43,391  64.9%
    2018-07  2090  47,960  64.9%
    2018-08  4181  41,096  65.0%
    2018-09  2369  31,965  65.1%
    
    data.to_csv('./data/housing_beijing.csv',index=False)
    
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    # 指定默认字体
    plt.rcParams['font.sans-serif']=['SimHei'] 
    plt.rcParams['font.family']='sans-serif' 
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus']=False
    
    data = pd.read_csv('./data/housing_beijing.csv')
    y = [float(s.replace(',','')) for s in data['均价'].values]
    plt.plot(y,color='red', marker='o', linestyle='solid')
    plt.xlabel(u'日期')
    plt.ylabel(u'均价(元)')
    plt.title(u'北京房价走势')
    plt.show()
    

    房价走势图

    matplotlib中文乱码的解决详见参考链接


    参考链接

    展开全文
  • 爬虫抓取数据

    千次阅读 2019-09-30 11:09:18
    这是一个入门级的简单的爬虫,更多内容请查看: ... 首先:爬虫常用的模块有requests和BeautifulSoup和lxml,所以要先用pip安装对应的模块,注意BeautifulSoup已被...BeautifulSoup是一个可以从HTML或XML文件中提取数...

    这是一个入门级的简单的爬虫,更多内容请查看:

    http://www.sterson.com.cn/

    首先:爬虫常用的模块有requests和BeautifulSoup和lxml,所以要先用pip安装对应的模块,注意BeautifulSoup已被移到bs4。

    Pip install lxml

    Pip install bs4

    BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。可以参考两个网址:

    英文:https://www.crummy.com/software/BeautifulSoup/bs4/doc/

    中文:https://beautifulsoup.readthedocs.io/zh_CN/latest/

    其次:要玩爬虫,还要懂一些html,因为要分析dom结构。

    下面的例子将从百度新闻中获取两个东西,一个是热点新闻,一个是热搜新闻词,跟着我来:

    1. 用浏览器打开百度新闻网址 http://news.baidu.com/
    2. 按F12查看dom结构,发现热点要闻都是在一个<strong>的标记里。
    3. 尝试一下看行不行
    4. # -*- coding: utf-8 -*-
      import requests
      from bs4 import BeautifulSoup
      import time

      # headers是模拟浏览器
      headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
                    
      "Accept": "text/plain", 'Connection': 'close'}

      url =
      "http://news.baidu.com/"

      # requests.get将返回URL的html内容
      r = requests.get(url, headers=headers)

      # 将返回的hmtl内容交给BeautifulSoup去格式化
      soup = BeautifulSoup(r.text, 'html.parser')

      # 获取热点新闻
      # 获取所有strong标记

      for s in soup.find_all('strong'):
          time.sleep(
      3)
         
      # 获取strong标记下的a标记
         
      a = s.find_all('a')
         
      # 获取a标记中的文本
         
      title = a[0].string
         
      # 获取a标记中的链接发址
         
      href = a[0].get('href')
         
      print('%s%s%s' % (title, ' : ', href))

      这里用到time.sleep(3),是每隔3秒获取一条新闻,虽然有headers模拟浏览器,但程序总是很快的,这样会引起服务器的察觉,你不是一个浏览器,是一个爬虫程序,可能会被屏蔽。相当于我们用程序模拟人工浏览网页的时间。点一条新闻看3秒,再去点开另一个条新闻。另外headers中加入'Connection': 'close' 有助于提高不会被发现是爬虫的机率,好多现有爬虫文章都没有用到这个

      运行以上程序看看结果,发现可以获取到热点新闻:

    接着继续看热搜新闻词的dom结构

    这次试着按dom 结构的层次往下找:

    在<body>下面有一个DIV,它的ID是body,

    再往下一层,有个DIV,它的ID是focus-top,

    再往下一层,有个DIV,它的class是 l-right-col,

    再往下一层,有个DIV,它的class是bd

     

     

    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import time

    # headers是模拟浏览器
    headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
                  
    "Accept": "text/plain", 'Connection': 'close'}
    url =
    "http://news.baidu.com/"
    # requests.get将返回URL的html内容
    r = requests.get(url, headers=headers)
    # 将返回的hmtl内容交给BeautifulSoup去格式化
    soup = BeautifulSoup(r.text, 'html.parser')
    # 获取热搜新闻词
    body = soup.body
    # 获取 id 为 body 的 div层
    div_1 = body.find('div', {'id': 'body'})
    # 获取 id 为 focus-top 的 div层
    div_2 = div_1.find('div', {'id': 'focus-top'})
    # 获取 class 为 l-right-col 的 div层
    div_3 = div_2.find('div', class_='l-right-col')
    # 获取 class 为 bd 的 div层
    div_4 = div_3.find('div', class_='bd')
    # 在class 为 bd 的 div层里获取所有a链接
    hotwords = div_4.find_all('a',target="_blank")
    for h in hotwords:
        time.sleep(
    3)
       
    print '%s%s%s' % (h.text, ' : ', h.get('href'))
     

     

    因为class是关键字,所以用class_ 。运行结果如下:

    其实可以将两个程序合并起来:

    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import time

    # headers是模拟浏览器
    headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
                  
    "Accept": "text/plain", 'Connection': 'close'}
    url =
    "http://news.baidu.com/"
    # requests.get将返回URL的html内容
    r = requests.get(url, headers=headers)
    # 将返回的hmtl内容交给BeautifulSoup去格式化
    soup = BeautifulSoup(r.text, 'html.parser')

    # 获取热点新闻
    # 获取所有strong标记

    for s in soup.find_all('strong'):
        time.sleep(
    3)
       
    # 获取strong标记下的a标记
       
    a = s.find_all('a')
       
    # 获取a标记中的文本
       
    title = a[0].string
       
    # 获取a标记中的链接发址
       
    href = a[0].get('href')
       
    print('%s%s%s' % (title, ' : ', href))
       

    # 获取热搜新闻词
    body = soup.body
    # 获取 id 为 body 的 div层
    div_1 = body.find('div', {'id': 'body'})
    # 获取 id 为 focus-top 的 div层
    div_2 = div_1.find('div', {'id': 'focus-top'})
    # 获取 class 为 l-right-col 的 div层
    div_3 = div_2.find('div', class_='l-right-col')
    # 获取 class 为 bd 的 div层
    div_4 = div_3.find('div', class_='bd')
    # 在class 为 bd 的 div层里获取所有a链接
    hotwords = div_4.find_all('a',target="_blank")
    for h in hotwords:
        time.sleep(
    3)
       
    print '%s%s%s' % (h.text, ' : ', h.get('href'))
     

    第一个超简单的爬虫就做完了,这里只是简单的将结果打印出来,至于结果数据要如何处理就看各位需要了。

    展开全文
  • IOS应用抓取HTML网页数据

    万次阅读 2015-09-10 14:20:34
    举例抓取hao123上的搞笑图片及Gif动画的网址为例。...2.获取HTML数据。方法如下:NSString *htmlString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.hao123.com/gaoxi
  • delphi写的 正则分析抓取html数据

    热门讨论 2010-03-11 19:53:54
    delphi写的正则分析抓取html数据 功能还可以吧,用了一个皮肤控件
  • R网页抓取数据

    千次阅读 2018-06-09 12:24:14
    R网页抓取数据web上有大量可用的数据。其中一些是以格式化的、可下载的data-sets的形式,易于访问。但大多数在线数据都是作为网络内容存在的,如博客、新闻故事和烹饪菜谱。使用格式化的文件,访问数据相当简单;只...
  • Python数据抓取

    2020-12-21 19:31:40
    myUrl="http://politics.people.com.cn/GB/1024/index.html"//要抓取网页的网址 myContent=requests.get(myUrl).content.decode("GB2312") print(myContent) 2.使用re 正则表达式抓取网页 import requests import ...
  • htmlparser实现从网页上抓取数据
  • 本文主要一步一步介绍利用C#抓取页面数据的过程,抓取HTML,获取标题、描述、图片等信息,并去除HTML,希望对大家有所帮助。
  • Jsoup实现网络爬虫抓取数据

    千次阅读 2017-03-09 13:37:40
    Jsoup实现网络爬虫抓取数据
  • 用于抓取数据并将其存储为 json 格式的 Java 代码。 代码被组织成三个功能: a. ScrapeTopic - 以站点主页 url 作为输入 ( ) b. ScrapeTeam - 为 8 个团队中的每一个调用的函数,参数为团队 url c。 ScrapePlayer ...
  • PHP登入网站抓取并且抓取数据

    千次阅读 2020-03-13 16:39:17
    有时候需要登入网站,然后去抓取一些有用的信息,人工做的话,太累了。有的人可以很快的做到登入,但是需要在登入后再去访问其他页面始终都访问不了,因为他们没有带Cookie进去而被当做是两次会话。下面看看代码 <...
  • Android手机抓取数据

    千次阅读 2014-09-04 15:23:21
    参考网址 http://blog.csdn.net/jiang1013nan/article/details/22943511 http://jingyan.baidu.com/article/acf728fd0802def8e510a3ae.html     1 获取手机root权限 ...3 抓取数据 3 分析数据
  • delphi抓取网页数据

    2018-09-17 16:29:32
    delphi抓取122考试平台预约学员数据 ,方便提前知道预约情况
  • python爬虫之requests抓取数据

    千次阅读 2018-02-06 16:28:28
    利用requests抓取数据
  • SimpleHtmlDom php使用simple_html_dom抓取网页数据的一个Demo
  • Htmlunit抓取数据失败

    2017-04-21 08:08:38
    Cannot locate declared field class org.apache.http.impl.client.HttpClientBuilder.dnsResolver ![图片说明](https://img-ask.csdn.net/upload/201704/21/1492761765_782220.png)
  • python抓取页面数据实例

    千次阅读 2016-10-17 15:48:28
    抓取文章数据保存在本地#coding=utf-8 import urllib import redef getHtml(url): page = urllib.urlopen(url) html = page.read() return htmldef getImg(html): reg = r'src="(.+?\.jpg)" pic_ext' imgre
  • java抓取网页数据示例

    2020-09-04 14:24:02
    要通java获取整个网页的html内容,或者某个网络文件的内容,可以使用java提供的HttpURLConnection类来实现对网页内容的抓取
  • python用read_html抓取网页表格型数据

    千次阅读 2019-07-09 09:16:09
    作用:快速获取在html中页面中table格式的数据 (2)to_sql的用法 将获得的DataFrame数据写入数据表中 (3)使用urlencode构造所需的url参数 摘要: 我们平常在浏览网页中会遇到一些表格型的数据信息,除...
  • 使用Java抓取网页数据

    2020-12-22 19:39:11
    一、使用 HttpClient 抓取网页数据 public String getHtml(String htmlurl) throws IOException { StringBuffer sb = new StringBuffer(); String acceptEncoding = ""; /* 1.生成 HttpClinet 对象并设置参数 */...
  • 方法二:(抓取html中table里面的数据) string html = @"<html>    <title></title>      <table>a  <table>b  <table>c  <table>d  <table>e    </html>  ";  var ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,739
精华内容 46,295
关键字:

html抓取数据