精华内容
下载资源
问答
  • 2017-12-07 21:46:23

    一、首先是获取指定路径下的网页内容。&二、通过指定url获取,网页部分想要的数据。

    package www.seach.test;
    
    import java.io.BufferedInputStream;
    import java.io.CharArrayWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    
    /**
     * 抓取网页工具类
     * @author g-gaojp
     * @date 2016-7-10
     */
    public class HttpUtils {
    
        /**
         * 获取网页数据
         * @param urlStr  访问地址
         * @param params  参数
         * @param charset 字符编码
         * @return
         * @throws Exception
         */
        public static String httpGet(String urlStr, Map<String, String> params,String charset) throws Exception {
            StringBuilder sb = new StringBuilder();
            if (null != params && params.size() > 0) {
                sb.append("?");
                Entry<String, String> en;
                for (Iterator<Entry<String, String>> ir = params.entrySet().iterator(); ir.hasNext();) {
                    en = ir.next();
                    sb.append(en.getKey() + "=" + URLEncoder.encode(en.getValue(),"utf-8") + (ir.hasNext() ? "&" : ""));
                }
            }
            URL url = new URL(urlStr + sb);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() != 200){
                throw new Exception("请求异常状态值:" + conn.getResponseCode());
            }
            BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
            Reader reader = new InputStreamReader(bis,charset);
            char[] buffer = new char[2048];
            int len = 0;
            CharArrayWriter caw = new CharArrayWriter();
            while ((len = reader.read(buffer)) > -1)
                caw.write(buffer, 0, len);
            reader.close();
            bis.close();
            conn.disconnect();
            return caw.toString();
        }
    
        /**
         * 获取网页数据
         * @param urlStr  访问地址
         * @param params  参数
         * @return
         * @throws Exception
         */
        public static String httpGet(String urlStr, Map<String, String> params) throws Exception {
            StringBuilder sb = new StringBuilder();
            if (null != params && params.size() > 0) {
                sb.append("?");
                Entry<String, String> en;
                for (Iterator<Entry<String, String>> ir = params.entrySet().iterator(); ir.hasNext();) {
                    en = ir.next();
                    sb.append(en.getKey() + "=" + URLEncoder.encode(en.getValue(),"utf-8") + (ir.hasNext() ? "&" : ""));
                }
            }
            URL url = new URL(urlStr + sb);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setRequestMethod("GET");
            if (conn.getResponseCode() != 200)
                throw new Exception("请求异常状态值:" + conn.getResponseCode());
            BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
            Reader reader = new InputStreamReader(bis,"gbk");
            char[] buffer = new char[2048];
            int len = 0;
            CharArrayWriter caw = new CharArrayWriter();
            while ((len = reader.read(buffer)) > -1)
                caw.write(buffer, 0, len);
            reader.close();
            bis.close();
            conn.disconnect();
            //System.out.println(caw);
            return caw.toString();
        }
    
    
        /**
         * 从获得的网页的document中获取指定条件的内容
         * @param document
         * @param condition 条件
         * @return
         */
        public static String catchInfomationFromDocument(Document document , String condition , int position){
    
            if(document != null){
                Iterator<Element> iterator = document.select(condition).iterator();
                if(iterator.hasNext()){
                    String str = iterator.next().text();
                    return str.substring(position).trim();
                }
            }
            return null;
        }
    
        /**
         * 判断从获得的网页的document中<br/>
         * 获取指定条件的内容是否存在
         * @param document
         * @param condition 条件
         * @return
         */
        public static boolean isExistInfomation(Document document , String condition){
    
            if(document != null){
                Iterator<Element> iterator = document.select(condition).iterator();
                if(iterator.hasNext()){
                    return true;
                }
            }
            return false;
        }
    
    
    
    
    
        public static void main1(String[] args) throws Exception
        { 
    //      String str=WebCrawlerDemo.httpGet("http://10.255.16.199/folder/xjzd/RDportal01151264064965188/2824.page",null);
    //      System.out.println(str);
            String str=HttpUtils.httpGet("http://10.255.16.199/folder/xjzd/RDportal01151264064965188/2824.page",null,"utf-8");
            System.out.println(str);
        }
        public static void main(String[] args) throws Exception
        { 
            Document doc = null;
            try {
                  doc = Jsoup.connect("写自己的url").userAgent("Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like               Gecko").timeout(30000).get();
            } catch (IOException e) {
                 e.printStackTrace();
            }
            for(Iterator<Element> ir = doc.select(".title_0").iterator();ir.hasNext();){
                System.out.println(ir.next().text());
         }
        }
    
    }

    对于那个select选择器,根据条件来选择,doc.select(“h3”).iterator(),对于Jsoup有以下规则:

    jsoup 是一款基于Java 的HTML解析器,可直接解析某个URL地址或HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
    jsoup的强大在于它对文档元素的检索,Select方法将返回一个Elements集合,并提供一组方法来抽取和处理结果,要掌握Jsoup首先要熟悉它的选择器语法。
    1、Selector选择器基本语法

    tagname: 通过标签查找元素,比如:a
    ns|tag: 通过标签在命名空间查找元素,比如:可以用 fb|name 语法来查找 元素

    id: 通过ID查找元素,比如:#logo

    .class: 通过class名称查找元素,比如:.masthead
    el#id: 元素+ID,比如: div#logo
    el.class: 元素+class,比如: div.masthead
    el[attr]: 元素+class,比如: a[href]
    任意组合,比如:a[href].highlight
    ancestor child: 查找某个元素下子元素,比如:可以用.body p 查找在”body”元素下的所有 p元素
    parent > child: 查找某个父元素下的直接子元素,比如:可以用div.content > p 查找 p 元素,也可以用body > * 查找body标签下所有直接子元素
    siblingA + siblingB: 查找在A元素之前第一个同级元素B,比如:div.head + div
    siblingA ~ siblingX: 查找A元素之前的同级X元素,比如:h1 ~ p
    el, el, el:多个选择器组合,查找匹配任一选择器的唯一元素,例如:div.masthead, div.logo
    3、Selector伪选择器语法

    :lt(n): 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:td:lt(3) 表示小于三列的元素
    :gt(n):查找哪些元素的同级索引值大于n,比如: div p:gt(2)表示哪些div中有包含2个以上的p元素
    :eq(n): 查找哪些元素的同级索引值与n相等,比如:form input:eq(1)表示包含一个input标签的Form元素
    :has(seletor): 查找匹配选择器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素
    :not(selector): 查找与选择器不匹配的元素,比如: div:not(.logo) 表示不包含 class=”logo” 元素的所有 div 列表
    :contains(text): 查找包含给定文本的元素,搜索不区分大不写,比如: p:contains(jsoup)
    :containsOwn(text): 查找直接包含给定文本的元素
    :matches(regex): 查找哪些元素的文本匹配指定的正则表达式,比如:div:matches((?i)login)
    :matchesOwn(regex): 查找自身包含文本匹配指定正则表达式的元素
    注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等。

    更多相关内容
  • 爬虫抓取网页数据

    2015-07-23 13:42:56
    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。具体功能是,通过scrapy和Python编程对BBS网站进行抓取数据
  • 基于Python爬虫技术的网页数据抓取与分析研究.pdf基于Python爬虫技术的网页数据抓取与分析研究.pdf基于Python爬虫技术的网页数据抓取与分析研究.pdf基于Python爬虫技术的网页数据抓取与分析研究.pdf基于Python爬虫...
  • 1.python 爬虫技术selenium和requests 2.python Excel表格处理 3.http请求的分析 4.python如何处理Json数据 处理办法:python 在网站爬取所有要素,程序中加入判断规则,输出成Excel表格。原来3天的工作量,现在1...
  • 主要介绍了JAVA使用爬虫抓取网站网页内容的方法,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
  • 爬虫入门(五)抓取网页数据

    千次阅读 2021-07-17 12:57:51
    因此在本节中,我们要介绍对比三种抓取数据的方式,也可以叫选择器,并给出他们的性能对比,以供选择。 1.分析网页 在抓取一个网页之前的具体内容之前,我们首先应该分析一下网页的结构。网页的构成是一种标签化的...

    前面已经实现了获取整个网页HTML的功能,并且在获取HTML的基础上,加上一些诸如:下载出错自动重试、用户代理、服务器代理、爬取深度、避免重爬、id遍历、链接遍历等进阶功能。而且在处理过程中也初步使用了正则表达式。

    但是前面我们获取的HTML中的数据很多,其中大部分是我们不需要的。因此在本节中,我们要介绍对比三种抓取数据的方式,也可以叫选择器,并给出他们的性能对比,以供选择。

    1.分析网页

    在抓取一个网页之前的具体内容之前,我们首先应该分析一下网页的结构。网页的构成是一种标签化的结构语言编写的。这些标签也可以看成一个个元素,比如标题元素、表单元素、表格元素、行元素、列元素。通常我们要抓取的数据就在这些元素内。

    通过F12或者右键查看页面源码,通过审查元素找到我们感兴趣的内容

    以示例网站为例,打开日本的网页地址:

    http://example.python-scraping.com/places/default/view/Japan-108

    按F12打开开发者工具,元素审查,找到自己感兴趣的内容,比如日本的面积、简称、语言等,

    发现这些元素位于一个表单form内,<tr>行标签内的<td>列元素,进一步发现<tr>有ID属性,<td>有class属性 通过这两个字段就可以精确定位到某行某列。

     2.抓取方式一正则表达式

    正如前面编写链接爬虫时那样,使用正则表达式匹配页面内容不失为一个好的方式,阅读编写正则表达式是一个爬虫程序员必备的技能

    2.1本例中用到的匹配规则如下:

    \b 匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。

    例如:

    “er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;

    “\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。

    r'':Python中字符串前面加上 r 表示原生字符串(rawstring)。不使用r,那么匹配时候需要4个反斜杠,正则需要转化一次,python解释器需要转化一次,使用r就不用使用转义字符

            如: >>> re.findall("abc\b","adsssa abc ")                 输出:[]

                     >>> re.findall(r"abc\b","adsssa abc ")               输出:['abc']

    在页面截图中,可以看到数据列

    查看元素发现他们储存在class="w2p_fw的<td>中的 </td><td class="w2p_fw">377,835 square kilometres</td>

    因此构造一个正则表达式r'<td class="w2p_fw">(.*?)</td>'可以完整匹配出所要的内容

    假如想精准定位日本的人口,定位id为places_population__row的<tr>标签元素的html格式如下

    <tr id="places_population__row"> <td class="w2p_fl"> <label class="readonly" for="places_population" id="places_population__label">Population: </label> </td> <td class="w2p_fw">127,288,000 </td> <td class="w2p_fc"> </td> </tr>

    因为网站有可能单引号双引号混用,或者多按了两个空格,因此引号用['"]匹配,空格用/s*匹配,最终构造的正则式为: r'<tr id=['"]places_population__row['"]>.*?<td\s*class=['"]w2p_fw['"]>(.*?)</td>'

     

    import re
    from scrap_01 import GetData            #该文件为在前两章中编写的获取网页HTML的方法
    url = 'http://example.python-scraping.com/places/default/view/Japan-108'
    html = GetData(url)
    data = re.findall(r'<td class="w2p_fw">(.*?)</td>',html)
    print(data)
    data2 = re.findall('''<tr id=['"]places_population__row['"]>.*?<td\s*class=['"]w2p_fw['"]>(.*?)</td>''',html)
    print(data2)

     3.抓取方式一Beautiful Soup

    从上个例子可以得出正则表达式存在这一定的缺点,如正则式难以构造、可读性差等 不过我们还有其他的库可以用,比如流行的BeautifulSoup和强大的lxml模块。

    3.1安装:pip install beautifulsoup4

    3.2使用步骤:

            1.将获得的HTML文档解析为soup文档

             Beautiful Soup能对一些不规范编写HTMl格式的文档进行修正,如标签闭合,属性值引号缺失

             soup = BeautifulSoup(html, 'html.parser')         

             #'html.parser'是BeautifulSoup默认的解析器,有时并不怎么好用,修正Html的能力有限。

            这里推荐使用html5lib或者lxml(下文中介绍)

             soup = BeautifulSoup(html, 'html5lib')

             2.使用find或者findall方法来定位元素

             find('tag','regex'),tag指标签类型,regex可以是attrs属性字典或者正则表达式,返回的是html形式的元素标签<class 'bs4.element.Tag'>

             find_all('tag','regex'),返回的是元素标签集合<class 'bs4.element.ResultSet'>

             td = soup.find('tr', attrs={'ID':'places_population__row'}) print(td.find('td'))                           

             print(td.find('td').text)

            3.获取标签内的文本

             对于就是标签内只有不含有其他标签子节点,那么这个 tag 可以使用 result.string 得到文本,也可以用 result.text 获得文本 如果 tag 包含了多个子节点,tag 就无法确定 result.string 方法应该调用哪个子节点的内容, result.string 的输出结果是 None

    from bs4 import BeautifulSoup
    import html5lib
    
    url = 'http://example.python-scraping.com/places/default/view/Japan-108'
    html = GetData(url)
    soup = BeautifulSoup(html, features="html5lib")
    tr = soup.find(attrs={'id':'places_population__row'})       #find()返回的是html形式的元素标签<class 'bs4.element.Tag'>
    print(tr)
    td = tr.find_all(attrs={'class':'w2p_fw'})                  #find_all返回的是元素标签集合<class 'bs4.element.ResultSet'>
    print(td)
    print(td[0].text)

    4.抓取方式一Lxml

            xml是XML和HTML的解析器,其主要功能是解析和提取XML和HTML中的数据; lxml和正则一样,也是用C语言实现的,是一款高性能的python HTML、XML解析器,也可以利用XPath语法,来定位特定的元素及节点信息 在解析HTML代码的时候,如果HTML代码不规范或者不完整,lxml解析器会自动修复或补全代码,从而提高效率

            4.1解析器解析html

             lxml通常都是用etree解析,这里用的是是lxml.html,其实etree功能更多,lxml.html专解析html,二者解析html的结果相差不大

             lxml.html:

                      import lxml.html html = lxml.html.fromstring(sample)

                      result2 = lxml.html.tostring(html,pretty_print =True)

                      print(result2)

             etree:

                     from lxml import etree html = etree.HTML(sample)

                     result1 = etree.tostring(html,pretty_print =True)

                     print(result1)

    附结构化输出概念: python中的pprint模块负责以合适的格式打印便于阅读的行块。它使用换行和缩进以明确的方式打印数据。 “pprint”模块它将对象格式化为可读的格式,每行都有适当的宽度。它带有可调节的宽度限制,以使它更容易为用户。 它将所有元素转换为可以用Python常量表示的字符串,并以美观的格式打印它们。pprint函数返回可以在解释器中作为输入运行的输出。 而且,通过解析字符串更容易将其转换回该类型。

    pprint的使用方法:

             import pprint                 

             #使用.pprint()对象或实例化我们自己的pprint对象PrettyPrinter()。

             pprint.pprint(['Radha', 1, 'Hari', 'Simesh', 25, 847])

             my_pprint = pprint.PrettyPrinter()

             my_pprint.pprint(['Radha', 1, 'Hari', 'Simesh', 25, 847])

    而在解析器lxml.html.tostring(html,pretty_print =True)中的pretty_print =True表达的即是要格式化输出 的意思

    4.2.选择(定位)元素

    选择的方法包括有:

            XPath选择器、find()方法或者CSS选择器。

    这里使用的是CSS选择器,因为它更加简介,并且能解析动态内容。

    安装:pip install cssselect

    使用:

            几个常用的选择器:

             *:通用选择器

             X:元素选择器

             #X:ID选择器

             .X:类选择器

             X Y:后代选择器

             X > Y:子元素选择器

             X[title]:简单属性选择器

             X[href="foo"]:精准属性值选择器

             X[href*="xxx"]:匹配部分属性值选择器

             X[href^="http"]:匹配属性值开头的选择器

             X[href$=".jpg"]:匹配属性值结尾的选择器

             X[data-*="foo"]:自定义属性选择器

             参考链接:https://blog.csdn.net/Ed7zgeE9X/article/details/102812665

    故我们所要构造的选择器:

    tr#places_population__row > td.w2p_fw

    意思为选择id为places_population__row的tr元素的子元素中类Class=w2p_fw的元素

    from lxml.html import fromstring,tostring
    import cssselect
    url = 'http://example.python-scraping.com/places/default/view/Japan-108'
    html = GetData(url)
    tree = fromstring(html)
    td = tree.cssselect('tr#places_population__row > td.w2p_fw')[0]
    print(type(td))
    population = td.text_content()
    print(population)

    4.3使用控制台+jQuery测试CSS选择器

    jquery是一个优秀的javascript的轻量级框架,兼容css3和各大浏览器。 Jquery就是1个js文件,只不过它对JS进行了简化。

            jQuery 库包含以下特性:

             HTML 元素选取

             HTML 元素操作

             CSS 操作

             HTML 事件函数

             JavaScript 特效和动画

             HTML DOM 遍历和修改

             AJAX Utilities

    在浏览器的开发者工具中的控制台上可以测试自己编写的CSS选择器

    $()或jQuery() 称之为jq选择器环境,在里面加上引号填写相关选择器即可,就可以获取匹配的元素。

    4.4XPath选择器

            CSS无法应对HTML非常不完整或者存在格式不当的问题时,这时CSS选择器可能会无法工作,尽管在解析时已经尽最大的努力修复html了, 但还是有很大的可能无法工作。这种情况下XPath可以帮助你基于页面的层次结构关系构建非常明确的选择器。

            XPath选择器:

    选取节点:
    表达式       描述                        示例              结果
    nodename   选取此节点的所有子节点            body           选取 body 元素的所有子节点
    /          从根节点选取                 /html          选取根元素 html
    //         匹配选择的当前节点,不考虑位置    //img          选取所有 img 元素,而不管它们在文档的位置
    .          选取当前节点                 ./img          选取当前节点下的 img 节点
    ..         选取当前节点的父节点         ../img         选取当前节点的父节点下的 title
    @          选取属性                       //a[@href=”image1.html”]   选取所有 href 属性为 “image1.html” 的 a 节点
                                            //a/@href       获取所有 a 节点的 href 属性的值
    使用谓词:
    谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语嵌在方括号中。
    路径表达式                  结果
    //body//a[1]               选取属于 body 子元素的第一个 a 元素
    //body//a[last()]          选取属于 body 子元素的最后一个 a 元素
    //a[@href]                 选取所有拥有名为 href 的属性的 a 元素
    //a[@href=’image2.html’]   选取所有 href 属性等于 “image2.html” 的 a 元素

    常用函数:
    contains(s1,s2)             如果s1中包含s2,返回True,否则返回False
    text()                      获取文本内容
    starts-with()               从起始位置匹配字符串  

     参考链接:https://blog.csdn.net/qq_32942549/article/details/78400675

    url = 'http://example.python-scraping.com/places/default/view/Japan-108'
    html = GetData(url)
    tree = fromstring(html)
    population = tree.xpath('//tr[@id="places_population__row"]/td[@class="w2p_fw"]/text()')[0]
    print(population)

    4.5lxml和家族树
    家族树就是html文档的dom树,lxml提供了访问网页中元素父亲、兄弟、孩子元素的方法
    方式:
    获取元素对象
    table = tree.xpath('//table')[0]
    1.得到孩子元素
        table.getchildren()
    2.得到前一个兄弟元素
        table.getprevious()
    3.得到后一个兄弟元素
        table.getnext()
    4.得到父元素
        table.getparent()

    5.性能对比

    由于lxml和re正则是用C语言写的,而BeautifulSoup是用python写的
    所以理论上来说BeautifulSoup的速度是相对要慢的多的
    抓取方式          性能          使用难度            安装难度
    正则表达式         快           困难                简单(内置模块)
    BeautifulSoup    慢            简单                简单(纯python)
    Lxml             快            简单                相对困难(3.9以后版本也简单)
    因此通常情况下lxml是最佳选择,因为该方法即快速又健壮

    展开全文
  • Python爬虫技术的网页数据抓取与分析.pdf
  • 基于Python爬虫技术的网页数据抓取与分析研究.docx基于Python爬虫技术的网页数据抓取与分析研究.docx基于Python爬虫技术的网页数据抓取与分析研究.docx基于Python爬虫技术的网页数据抓取与分析研究.docx基于Python...
  • 使用爬虫抓取网页内容

    千次阅读 2020-09-09 10:31:11
    对于爬虫我们首先想到的是 python,但是对于前端来说我们通常是 node 来写爬虫,去抓取网站数据而已。 爬虫的基本流程 1、发起请求 使用http库向目标站点发起请求,即发送一个Request,第三方请求库如 request,...

    logo

    对于爬虫我们首先想到的是 python,但是对于前端来说我们通常是 node 来写爬虫,去抓取网站的数据而已。

    爬虫的基本流程

    在这里插入图片描述

    1、发起请求
    使用http库向目标站点发起请求,即发送一个Request,第三方请求库如 request,axios 等。
    Request包含:请求头、请求体等

    2、获取响应内容
    如果服务器能正常响应,则会得到一个Response
    Response包含:html,json,图片,视频等

    3、解析内容
    解析html数据:正则表达式,第三方解析库如cheerio,PhantomJS,JSDom.等
    解析json数据:json模块
    解析二进制数据:以buffer的方式写入文件。

    #4、保存数据
    数据库

    接下来以爬去腾讯网文章数据为例,首先要知道网站的请求地址是 https://www.qq.com/,根据这个地址我们发送一个请求,得到网站的源代码:

    const request = require('request');
    const url = 'https://www.qq.com/'
    const fs = require('fs')
    const cheerio = require('cheerio')
    const iconv = require('iconv-lite')
    
    request({url, encoding: null}, (err, response, body) => {
      let result = iconv.decode(body, 'gb2312');
      console.log(result)
    })
    

    在得到网站源代码的过程中我们发现网站不是 utf8 编码格式的,而是 gb2312 的形式,所以我们借助 iconv-lite 模块解析。

    得到了响应的内容之后,我们需要提取 html 中的内容,这次我想抓取网站的新闻标题部分。

    const request = require('request')
    const url = 'https://www.qq.com/'
    const fs = require('fs')
    const cheerio = require('cheerio')
    const iconv = require('iconv-lite')
    
    request({url, encoding: null}, (err, response, body) => {
      let result = iconv.decode(body, 'gb2312');
      let list = []
      let $ = cheerio.load(result)
      $('.yw-list li').each((i, ele) => {
        let text = $(ele).text().replace(/\s/g, '')
        list.push(text)
      })
      console.log(list)
      fs.writeFileSync('qq.json', JSON.stringify(list))
    })
    

    提取部分有用的内容之后,通常是保存到数据库中,或者写入到文件系统中。

    展开全文
  • Python爬虫技术的网页数据抓取与分析
  • Python爬虫工程师-App数据抓取思维导图,便捷整理思路,目标、对项目、公司、个人的意义、爬虫工程师技术储备
  • 基于Python爬虫技术的网页数据抓取与分析研究
  • 只要能通过浏览器访问的数据都可以通过爬虫抓取爬虫的本质:模拟浏览器打开网页,获取网页中我们想要的那部分数据。 1. 获取数据 python一般使用urllib2获取页面数据 2. 解析数据 通过导入from bs4 import ...

    爬虫初识

    什么是爬虫?

    1. 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析已成为如今主流的爬取策略。
    2. 只要能通过浏览器访问的数据都可以通过爬虫抓取。
    3. 爬虫的本质:模拟浏览器打开网页,获取网页中我们想要的那部分数据。

    1. 获取数据

    python一般使用urllib2获取页面数据

    import urllib.request
    
    # 获取一个get请求
    response = urllib.request.urlopen("https://www.baidu.com/")
    print(response.read().decode("utf-8") # 获取到的网页资源进行utf-8解码
    
    # 获取一个post请求
    import urllib.parse
    data = bytes(urllib.parse.urlencode({"hello":"world"},encoding = "utf-8"))
    response = urllib.request.urlopen("http://httpbin.org/post",data = data)
    print(response.read())
    
    
    # 超时处理
    try:
       response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
       print(response.read().decode("utf-8"))
    except urllib.error.URLError as e:
       print("time out!")
    
    # 获取请求状态
    response = urllib.request.urlopen("https://www.baidu.com/")
    print(response.status())
    
    # 将代理更改为模拟浏览器访问
     head = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
            # 模拟浏览器头部信息
        }
        request = urllib.request.Request(url, headers=head)
    
    

    2. 解析数据

    通过导入from bs4 import BeautifulSoup

    from  bs4 import  BeautifulSoup
    
    # 打开html文件(可以自定义,但一般都是抓取的页面信息进行解析)
    file = open("./文件名.html")
    html = file.read()
    # 通过html.parser 解析器解析网页数据,给到bs对象
    bs = BeautifulSoup(html,"html.parser")
    # bs对象存储网页标签元素及其内容(之能拿到找到的第一个内容),以下打印的是title标签中包含的内容 1.Tag 标签及其内容
    print(bs.title)
    
    # .string帮助拿到标签中的内容 2.通过type(bs.title.string),得到类型为NavigableString
    print(bs.title.string)
    
    # .attrs拿到该标签下的所有属性,并以键值对(字典)的方式表示
    print(bs.a.attrs)
    
    # 3.BeautifulSoup类型,拿到网页所有元素
    print(bs)
    
    # 4.Comment  是一个特殊的NavigableString 输出内容不包含注释符号
    
    

    2.1 遍历文档树

    1. .contents :获取Tag的所有子节点,返回一个list
    # tag的.content 属性可以将tag的子节点以列表的方式输出
    print(bs.head.content)
    # 用列表索引来获取它的某一个元素
    print(bs.head.content[1])
    
    
    1. children : 获取tag所有子节点返回一个生成器
    for child in bs.body.children:
        print(child)
    

    2.2文档搜索

    # 1.find_all() 
    # 通过find_all()方法找到所有的a标签:字符串过滤,会查找到与字符串完全匹配的内容
    t_list = bs.find_all(a)
    print(t_list)
    
    
    # 正则表达式搜索,使用search()方法来匹配内容
    t_list = bs.find_all(re.compile("a")) # 查询到列表标签包含a字符串的内容
    print(t_list)
    
    
    
    # 方法:传入一个函数(方法),根据函数的要求来搜索
    def name_is_exists(tag):
        return tag.has_attr("name") #找到元素包含name属性的标签
    t_list = bs.find_all(name_is_exists)
    print(t_list)
    
    
    
    # 2. Kwargs 参数:指定参数进行搜索
    t_list = bs.find_all(id="head") # 查询属性id 等于head 的内容
    
    t_list = bs.find_all(class_=True) # 打印标签包含class属性的内容
    
    
    # 3. text 参数
    t_list= bs.find_all(text="hao123")  #打印结果为 hao123
    
    t_list= bs.find_all(text= re.compile("/d")) # 通过正则表达式打印出所有文本内容带数字的内容
    
    # 4.limit 参数 控制输出的个数
    t_list= bs.find_all("a",limit=3) # 找到html中前三个带a标签的内容
    
    
    # 5.css选择器
    t_list= bs.select('title')  # 通过标签来查找
    t_list= bs.select('.类名')  # 通过类名
    t_list= bs.select('id') # 通过id
    t_list= bs.select("a[class = 名字]") # 查找a标签中 class= 名字 的内容
    t_list= bs.select("head > title") # 找到父标签head下的子标签 title
    
    t_list= bs.select(".类名1 ~ .类名2") # 找到.类名1 的兄弟标签.类名2
    # 打印兄弟标签的内容
    print(t_list[0].get_test())
    
    # 通过for循环打印出来的内容更易阅读
    for item in t_list:
        print(t_list)
        
    

    2.3 正则表达式

    通用,且常用的正则表达式

    操作符说明实例
    .表示任何单个字符
    [ ]字符集,对单个字符给出取值范围[abc] 表示a、b、c,[a-z]表示a到z单个字符
    [^ ]非字符集,对单个字符u给出排除范围[^abc] 非a或b或c的单个字符
    *前一个字符0次或无限次扩展abc* 表示 ab、abc、abcc、abccc等
    +前一个字符1次或无限次扩展abc+ 表示abc、abcc、abccc等
    ?前一个字符0次或1次扩展abc? 表示ab、abc
    左右表达式任意一个abd丨def 表示abc、def

    “左闭右开”是指区间不包括左边的内容,但是涵盖右边的内容。

    操作符说明实例
    {m}扩展前一个字符m次ab{2}c 表示abbc,ab{3}c 表示abbbc
    {m,n}扩展前一个字符m至n次(含n)ab{1,2} c 表示abc、abbc
    ^匹配字符串开头^abc 表示abc且在一个字符串的开头
    $匹配字符串结尾abc$ 表示abc且在一个字符串的结尾
    ( )分组标记,内部只能使用丨操作符(abc)表示abc,(abc丨def)表示abc、def
    \d数字,等价于[0-9]
    \w单词字符,等价于[A-Za-z0-9]表示A到Z,a到z,数字0到9

    Import re
    导入的re库的主要功能函数

    函数说明
    re.search()在字符串中搜索匹配正则表达式的第一个位置,返回match对象
    re.match()从一个字符串的开始位置起匹配正则表达式,返回match对像
    re.findall()搜索字符串,以列表类型返回全部能匹配的子串
    re.split()将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
    re.finditer()搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
    re.sub()在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串

    3. 数据存储

    3.1 数据存储–excel

    import xlwt
    # 创建workbook 对象
    workbook = xlwt.Workbook(encoding="utf-8")
    
    # 创建工作表
    worksheet = workbook.add_sheet('sheet1')
    # 例: 存入九九乘法表
    for i in range(1, 10):
        for j in range(1, i+1):
            worksheet.write(i-1, j-1, "%d * %d = %d" % (i, j, i*j))
    # 保存数据表
    workbook.save('student.xls')
    

    3.2 数据存储–SQLite

    (后期补上)

    4. 爬取源码

    from bs4 import BeautifulSoup  # 网页解析,获取数据
    import re  # 正则表达式,进行文字匹配
    import urllib.request, urllib.error  # 指定URL, 获取网页数据
    import xlwt  # 进行excel操作
    import sqlite3  # 进行SQLite进行数据库的操作
    
    
    def main():
        # 获取网页链接
        base_url = "https://movie.***(某电影网站).com/top250?start="
        # 1.爬取网页
        datalist = getData(base_url)
    
        savePath = "某电影电影top250.xls"
        # 3.保存数据
        saveData(savePath, datalist)
    
    
    # 创建正则表达式对象,表示规则(字符串模式)
    # 影片详情链接规则
    findLink = re.compile(r'<a href="(.*?)">') 
    # 影片图片
    findImgSrc = re.compile(r'<img.*src="(.*?)"/>', re.S)  # re.S 让换行符包含在字符中
    # 影片片名
    findTitle = re.compile(r'<span class="title">(.*)</span>')
    # 影片评分
    findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    # 评价人数
    findJudge = re.compile(r'<span>(\d*)人评价</span>')
    # 概况
    findInq = re.compile(r'<span class="inq">(.*)</span>')
    # 找到影片的相关内容
    findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
    
    
    # 1.爬取网页
    def getData(base_url):
        datalist = []
        for i in range(0, 10):  # 调用获取页面信息的函数10次
            url = base_url + str(i * 25)  # 为参数start赋值
            html = askURL(url)  # 获取到的一页html,返回给到html对象
    
            # 2.逐一解析数据(在爬取页面时就直接解析,而不是爬取所有在解析)
            # 解析器:html.parser 解析html
            soup = BeautifulSoup(html, "html.parser")
            # 查找网页所有的内容,取标签为div 属性为item的div
            for item in soup.find_all("div", class_="item"):
                data = []  # 保存一部电影的所有信息
                item = str(item)  # 转成字符串
    
                # 比较规则为findLink 从item里面找出符合findlink规则的内容取第一个符合条件的
                link = re.findall(findLink, item)[0]  # 获取影片链接
                data.append(link)  # 将链接添加到数组中
    
                # 添加图片
                imgSrc = re.findall(findImgSrc, item)[0]
                data.append(imgSrc)
    
                # 片名存在中文名,或者中文加外文名
                titles = re.findall(findTitle, item)
                if len(titles) == 2:
                    # 添加中文名
                    chinese_title = titles[0]
                    data.append(chinese_title)
                    # 添加外文名  .replace("/", "") 将字符/ 用空值代替
                    foreign_title = titles[1].replace("/", "")
                    data.append(foreign_title)
                else:
                    data.append(titles[0])
                    data.append(' ')  # 没有外国名字时 外国名字留空
    
                # 评分
                rating = re.findall(findRating, item)[0]
                data.append(rating)
    
                # 评价人数
                judgeNum = re.findall(findJudge, item)[0]
                data.append(judgeNum)
    
                # 概况
                inq = re.findall(findInq, item)
                if len(inq) != 0:
                    inq1 = inq[0].replace("。", "")
                    data.append(inq1)
                else:
                    data.append(' ')
    
                # 电影相关内容
                bd = re.findall(findBd, item)[0]
                # 将bd 对象中的<br>标签
                bd = re.sub(r'<br(\s+)?/>(\s+)?', "", bd)
                # 替换\
                bd = re.sub('/', " ", bd)
                # 去掉前后空格
                data.append(bd.strip())
                datalist.append(data)
        print(datalist)
        return datalist
    
    
    # 3.保存数据
    def saveData(savePath, datalist):
        # 创建workbook 对象
        book = xlwt.Workbook(encoding="utf-8", style_compression=0)
    
        # 创建工作表
        sheet = book.add_sheet('某电影Top250', cell_overwrite_ok=True)
        col = ("电影链接", "图片链接", "影片中文名", "影片外文名", "评分", "评价数", "概况", "相关信息")
        for i in range(0, 8):
            sheet.write(0, i, col[i])  # 写入列名
        for i in range(0, 250):
            print("第%d条" % (i+1))
            # 取datalist中的第i条数据存入data对象
            data = datalist[i]
            for j in range(0, 8):
                # 将data中的第一条数据 存成8列
                sheet.write(i+1, j, data[j])
    
        # 保存数据表
        book.save(savePath)
    
    
    # 得到一个指定URL的网页内容(一共250 条,需要爬取25个页面)
    def askURL(url):
        # User - Agent 告诉豆瓣服务器,我们是什么类型的机器
        head = {
            "User-Agent": "Mozilla/ 5.0(Windows NT 10.0;Win64; x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 96.0.4664.93Safari / 537.36"
            # 模拟浏览器头部信息
        }
        request = urllib.request.Request(url, headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
            # print(html)
        except urllib.error.URLError as e:
            if hasattr(e, "code"):
                print(e.code)
            if hasattr(e, "reason"):
                print(e.reason)
        return html
    
    
    if __name__ == '__main__':
        main()
        print("爬取完毕")
    
    
    展开全文
  • 基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.pdf基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.pdf基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.pdf基于Python爬虫技术的IT类毕业生...
  • 基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.docx基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.docx基于Python爬虫技术的IT类毕业生求职数据抓取与分析研究.docx基于Python爬虫技术的IT类毕业...
  • java爬虫抓取网页数据教程(20210809124656).pdf
  • 主要介绍了使用java技术抓取网站上彩票双色球信息详解,web结果由html+js+css组成,html结构都有一定的规范,数据动态交互可以通过js实现。,需要的朋友可以参考下
  • java爬虫抓取城市数据

    2017-09-27 01:20:11
    java爬虫抓取城市数据,数据抓取后直接持久化到数据库当中。博客地址http://blog.csdn.net/qq_23994787/article/details/78107890 如果没有积分的话,在主页给博主发邮件获取。
  • 由此,网络爬虫技术应运而生。 本文目录,你将会看到 网络爬虫简介 实例分析 示例背景 问题总括 示例全代码 数据处理与可视化之Altair 后言-python爬虫相关库 网络爬虫简介 网络爬虫(webcrawler,又被称为...
  • 针对这些问题,提出了一个基于多数据源的论文数据爬虫技术。首先,以知网、万方数据、维普网、超星期刊四大中文文献服务网站数据源,针对检索关键词完成列表页数据的爬取与解析;然后通过任务调度策略,去除各数据...
  • python基于爬虫技术的海量电影数据分析源码。架构 本系统主要分为四个部分,分别为后端爬虫抓取数据处理分析可视化、GUI界面展示、启动运行,分别对应getData.py、pyec.py、GUI.py、main.py四个文件。 并且包含...
  • java抓取技术源码 多线程爬虫--抓取淘宝商品详情页URL 本项目是一个Java编写的多线程爬虫系统。此系统与我之前开发的结合使用,共抓取了淘宝近3000个页面,从中解析到了近9万的商品详情页URL。 我并没有直接将这些...
  • 爬虫入门,快速抓取数据

    千次阅读 2020-09-08 15:11:50
    这篇文章会从零开始介绍如何编写一个网络爬虫抓取数据,然后会一步步逐渐完善爬虫的抓取功能。 我们使用python 3.x作为我们的开发语言,有一点python的基础就可以了。 首先我们还是从最基本的开始。 工具安装 ...
  • 如何快速爬取网页数据(干货)

    万次阅读 多人点赞 2019-09-11 17:25:48
    网页数据爬取是指从网站上提取特定内容,而不需要请求网站的API接口获取内容。“网页数据” 作为网站用户体验的一部分,比如网页上的文字,图像,声音,视频和动画等,都算是网页数据。 对于程序员或开发人...
  • 学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫。 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候,搜索Python,...
  • 爬虫数据存储可分为如下两种方式: 文件存储 数据库存储 对于抓取数据种类丰富、数量庞大的大规模爬虫来说,我们可以将这些爬虫结果存入数据库中,不仅方便存储,也方便进一步整理。 对于这种中小规模的爬虫而言...
  • 网络爬虫技术怎样实现抓取页面往期交易数据?跪求 要抓取的是这个网站过去每天的交易数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,279
精华内容 10,511
关键字:

爬虫技术抓取网站数据

友情链接: Lato.zip