zoukankan      html  css  js  c++  java
  • 爬虫

    1.对于爬虫的基本了解

      1.爬虫的出现,可以在一定的程度上代替手工访问网页,所以,原先我们需要人工去访问互联网信息的操作,现在都可以用爬虫自动化实现,这样就可以更高效率的利用好互联网中的有效信息

      2.检索是一种行为,而索引是一种属性,如果有一个好的索引,则可以提高检索的效率,如果没有索引,则检索的效率会很低

      3.用户爬虫是网络爬虫的其中的一种类型,所谓用户爬虫,就是专门用来爬取互联网中用户数据的一种爬虫,由于互联网中的用户数据信息,相对来说是比较敏感的数据信息,所以,用户爬虫的利用价值也是相对较高的

      4.爬行侧罗主要有深度优先爬行策略,广度优先爬行策略,大站优先策略,反链策略,和其他爬行策略等

      5.常见的网页更新策略:用户体验策略,历史数据策略,聚类分析策略等

      6.网页分析算法:基于用户行为的网页分析算法,基于网络拓扑的网页分析算法,基于网页内容的网页分析算法,

      7.一般爬虫访问一个网站的时候,首先会根据该站点下的robots.txt文件来确定可以爬取的范围,Robots协议是需要网络爬虫共同遵守的协议,对于一些禁止的URL地址,网络爬虫不应该去爬取

    2.urllib介绍

      urllib库是Python中一个功能强大,用于操作url,并且在做爬虫的时候经常要用到的库。

    3.urllib库的常用方法

      1.urllib.request.urlopen(url, timeout)    返回指定url地址的源码,并且可以设置访问时长,第一个参数是url地址,第二个参数是访问时长

      2.urllib.request.urlretrieve(url, path)    将指定的url地址的源码直接存储到指定的路径中,第一个参数是url地址, 第二个参数是存储路径

      3.前提 : data = urllib.request.urlopen(url)

        1.data.info()    返回网页全部信息

        2.data.getcode()   返回当前网页的状态码

        3.data.geturl()          返回源码对象的真实url地址

      4.urllib.quote(url)      参数为url地址,将url编码

      5.urllib.unquote(url)   参数是已经被编码的url,功能是将编码的url解码

      6.urllib.parse.urlencode(post_info)   参数为需要提交的post表单中的数据内容,比如用户名和密码的pos表单提交,以字典的方式

    4.浏览器的模拟----heads属性

      功能:伪装成浏览器去访问服务器,设置heads属性,是因为有些网站具有反爬虫设置

      1.使用build_opener() 修改报头

    # 1.使用build_opener()修改报头
    
    
    import urllib.request
    
    url = 'https://blog.csdn.net/W5AeN4Hhx17EDo1/article/details/82186234'  # csdn的某篇文章
    head = ('User-Agent', "头信息")  # 头信息
    
    opener = urllib.request.build_opener()   # 创建自定义的opener对象
    
    opener.addheaders = [head]   # 设置头信息
    
    data = opener.open(url)  # 此时已经是具有头信息的打开操作行为,就是回去模仿浏览器去打开对应的网址了,服务器不会认为是爬虫
    
    print(data.getcode())  # 测试是否可以输出状态码

      2.使用add_header() 添加报头

    # 2.使用add_header()添加报头
    import urllib.request
    
    url = 'http://www.baidu.com'
    
    req = urllib.request.Request(url)  # 定义一个Request对象
    
    req.add_header('User-Agent', '头信息')  # 添加头信息
    
    data = urllib.request.urlopen(req)  # 伪装成浏览器去请求服务器
    
    print(data.getcode())  # 测试是否访问成功,并且返回状态码

    5.http协议请求主要分为6种类型

      1.get请求:get请求会通过url网址传递信息,可以直接在url中写上要传递的信息,也可以由表单进行传递,如果使用表单进行传递,这个表单中的信息会自动转为url地址中的数 ;据,通过url地址传递

      2.post请求:可以向服务器提交数据,是一种比较主流也是比较安全的数据传递方式,比如在登录的时候,经常使用post请求发送数据

      3.put请求:请求服务器存储一个资源,通常要指定存储的位置

      4.delete请求:请求服务器删除一个资源

      5.head请求:请求获取对应的http报头信息

      6.options请求:可以获得当前url所支持的请求类型

    6.代理服务器的设置

      1.由来:有时候使用同一个ip去爬取同一个网站上的网页,久了之后就会被网络屏蔽,所以出现了代理服务器,可以在服务器那边显示着其他电脑在对网址进行访问

      2.代理服务器包括:ip和port(端口),格式(ip:port)

      3.设置代理服务器代码实例

    # 代理服务器的设置
    
    import urllib.request
    
    # 将要访问的url网址
    url = 'http://www.baidu.com'
    
    # 代理服务器
    agency_sever = {'http': '183.129.207.83:10800'}
    
    # 设置对应的代理服务器信息
    proxy = urllib.request.ProxyHandler(agency_sever)
    
    # 自定义一个opener对象
    opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
    
    # 将opener对象创建为全局默认的对象
    urllib.request.install_opener(opener)
    
    # 使用opener对象对网站进行请求
    data = urllib.request.urlopen(url)
    
    # 测试使用,返回网页的所有信息
    print(data.info())

     7.URLerror的异常处理

      1.一般来说,产生URLerror的原因有一下几种原因

        连接不上服务器

        远程url不存在

        无网络

        触发了HTTPerror

      

    # 异常处理神器---URLerror实战
    
    import urllib.request
    import urllib.error
    
    try:
        urllib.request.urlopen('https://www.baidu.com')
    except urllib.error.URLError as e:
        print(e.code)
        print(e.reason)

      2.常见的状态码及其含义

        200:一切正常

        301:重定向到新的url,永久性

        302:重定向到临时的url,非永久性

        304:请求的资源未更新

        400:非法请求

        401:请求未经授权

        403:禁止访问

        404:没有找到对应的页面

        500:服务器内部出现错误

        501:服务器不支持实现请求所需要的功能

      3.hasattr()的使用实例

    import urllib.request
    import urllib.error
    
    try:
        urllib.request.urlopen('https://www.baidua.com')
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):     # hasattr 方法用于判断错误对象是否有code值,如果有,就打印,没有就不打印
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)

     8.多线程爬虫实现

      相比普通的单线程爬虫,多线程爬虫其效率会更加的高

      所谓的多线程爬虫,指的是爬虫中的某个部分程序可以并行执行,即在多条线上执行,这种执行结构称为多线程结构,对应的爬虫称为多线程爬虫

    # 简单模拟了,在Python中使用threading模块如何进行多线程执行程序
    import threading
    class A(threading.Thread):
        def __init__(self):
            # 初始化该线程
            threading.Thread.__init__(self)
    
        def run(self):
            # 该线程需要执行的程序内容
            for i in range(10):
                print('我是线程a')
    
    class B(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
        def run(self):
            for i in range(10):
                print('我是线程b')
    
    
    t1 = A()  # 实例化线程A为t1
    t1.start()  # 启动线程t1
    
    t2 = B()
    t2.start()

    9.正则和cookie的应用

      有时候我们进行字符串处理的时候,希望按照自定义的规则进行处理,我们将这些规则称为模式,我们可以使用正则表达式来描述这些自定义规则,正则表达式也称为模式表达式

      一个网址一般通过cookie保存客户端和服务端之间的会话信息,或者是通过session保存会话信息

      cookie:将所有的会话信息保存在client端

      session:将所有的会话信息保存在server端

      HTTP协议是一个无状态协议,所谓的无状态协议就是无法维持会话的状态,所以就出现了cookie和session来存储会话信息

      1.进行cookie处理的一种常用思路

        1.导入cookie处理模块http.cookiejar

        2.使用http.cookiejar.cookiejar() 来创建cookiejar对象

           3.使用urllib.request.HTTPCookieProcessor创建cookie处理器,并且以其为参数构建opener对象

        4.创建全局默认的opener对象

    # 使用cookiejar库的大致模板
    
    import urllib.request
    import http.cookiejar
    import urllib.parse
    
    
    url = '' # 将要访问的url网址
    postdata = urllib.parse.urlencode({
        'usename': ' '  # 提交的表单信息以键值对的方式存储
        'password': ' '
    }).encode('utf-8')
    
    req = urllib.request.Request(url, postdata)   # 创建Request对象
    req.add_header('User-Agent':' ')  # 添加报头信息
    
    cjar = http.cookiejar.CookieJar()   # 创建cookiejar对象
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))  # 创建cookie处理器,并且以其为参数构建opener对象
    urllib.request.install_opener(opener)  # 将opener安装为全局
    
    file = opener.open(req)
    data = file.read()

    10.Python的队列操作

      通过queue模块来实现,通过queue.Queue()实例化一个队列对象,并且通过队列对象的put方法实现将一个数据入队列的操作,每次入完队列之后可以通过task_done()方法表示该次入队列任务完成,如果需要出队列,则可以通过队列对象的get()方法实现

    import queue
    
    line_obj = queue.Queue()  # 创建队列对象
    test_list = ['hello', 'world', 'hello world']
    for i in test_list:
        line_obj.put(i)
        line_obj.task_done()
    for i in range(3):
        print(line_obj.get())

     11.fiddler

      1.fiddler是一种常见的抓包分析软件,同时,我们可以利用fiddler详细的对http请求进行分析,并且模拟对应的http请求

      2.网络爬虫是自动爬取网页的程序,在爬取的过程中必然涉及到客户端和服务器端之间的通信,自然也是需要发送一些http请求,并接受服务器返回的结果,在一些稍微复杂的网络请求中,我们直接看网址的变化是看不出规律的,此时如果要进行自动化爬取网页,就必须要通过程序构造这些请求,而要通过程序构造这些请求,就必须首先分析这些请求的规律,所以此时我们要使用工具来截获这些请求,对这些请求进行分析,这个过程如果使用抓包软件配合进行工作,则将会变得更加方便

      3.fiddler默认监控的地址是127.0.0.1:8888

      4.fiddler是以作为代理服务器的方式进行工作的,所以,本地应用于服务器传递的这些数据都会经过fiddler,有的时候,我们希望在传递的中间进行修改后再传递,那么我们可以使用fiddler的断电功能

    12.浏览器伪装技术                                                                                                

      由来:有些网站可以识别出访问者是通过浏览器还是爬虫等自动程序访问网站,如果识别出使用的不是浏览器,则会禁止访问者或者是禁止该用户在网站的其他操作,比如不允许登录等,如果此时我们想对该网站进行爬取,则需要使用浏览器伪装技术

      1.有些网站为了避免爬虫的恶意访问,就会设置一些反爬虫的机制,常见的反爬虫机制有如下:

        1.通过分析用户请求的headers信息进行反爬虫

        2.通过检测用户行为进行反爬虫,比如通过判断同一个ip在短时间内是否频繁的访问对应网站来进行分析

        3.通过动态页面来增加爬虫爬取的难度,达到反爬虫的目的

      2.将爬虫伪装成浏览器,简单的伪装只需要设置好‘user agent’字段的信息即可

      如果要进行高相似度的浏览器伪装,就需要将用户请求的headers信息中常见的字段都构造在爬虫程序中

      3.经常需要用到的headers字段

        Accept: 浏览器支持的内容类型

        Accept-Language:  浏览器支持的语言

        Accept-Encoding:  浏览器支持的压缩编码格式

        User-Agent:  浏览器的版本信息,以及操作系统的一些信息(版本号等)

        Connection:  服务器端和客户端之间的连接方式

        referer:   表示该网址的来源网址

      4.高相似度模拟浏览器访问网页(news.baidu.com)实例代码

    # 高相似度的模拟浏览器访问网页
    
    import urllib.request
    import http.cookiejar
    
    cjar = http.cookiejar.CookieJar()  # 创建cookie对象
    
    headers_info = {            # 构造服务器所需的headers信息
        'User-Agent': '',
        'Accept': '',
        'Accept-Language': '',
        'Accept-Encoding': '',
        'Connection': '',
        'referer': 'http://www.baidu.com'
    }
    
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))   # 创建opener对象
    
    headers_all = []   # 创建一个空的列表,用于存储构造的服务器所需的headers信息
    
    for key, value in headers_info.items():   # 循环遍历装有headers的全部信息的字典,然后将字典中的键值对以元组的形式存储在一个列表中
        header = (key, value)
        headers_all.append(header)
    
    opener.addheaders = headers_all   # 将构造的所有headers信息封装在opener对象中
    
    urllib.request.install_opener(opener)  # 将opener对象设置为全局类型
    
    data = urllib.request.urlopen('http://news.baidu.com/').read()     # 获取到对应网页的源码
    with open('C:/Users/Administrator/Desktop/spider/1.html', 'wb') as file:
        file.write(data)  #  将网页的源码写入文件中

    13.爬虫的定向爬取技术

      爬虫的定向爬取技术主要需要解决三个问题:

        1.清晰的定义好爬虫的爬取目标,规划好主题

        2.建立好爬取网址的过滤筛选规则以及内容的过滤筛选规则

        3.建立好URL排序算法,让爬虫能够明确优先爬取那些网页,以什么顺序爬取待爬取的网页。比如,待爬取的url网址可能有很多,在爬虫资源优先的情况下,需要确定好这些网址的爬行顺序,以不一样的顺序去爬取,可能会导致不一样的爬取效率

    14.爬虫框架的简单介绍

      1。简单来说,Python的爬虫框架就是一些爬虫项目的半成品,比如我们可以将一些常见爬虫功能的实现代码部分写好,然后留下一些接口,在做不同的爬虫项目的时候,我们只需要根据实际情况,手写少量需要变动的代码部分,并且按照需求调用这些接口,即可以实现一个爬虫项目

      2.scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速,高层次的信息爬取框架,可以高效的爬取web页面并且提取出我们关注的结构化数据

      3.scrapy框架的应用领域有很多,比如网络爬虫开发,数据挖掘,数据监测,自动化测试等

      4.crawley也是使用Python开发出来的一款爬虫框架,该框架致力于改变人们从互联网中提取数据的方式,让大家可以更加高效的从互联网中爬取对应的内容

      5.portia框架是一款允许没有任何编程基础的用户可视化的爬取网页的爬虫框架,给出你要爬取的网页中感兴趣的数据内容,通过portia框架,可以将你所要爬取的信息从相似网页中自动提取出来

      6.newspaper框架是一种用来提取新闻,文章以及内容分析的Python爬虫框架,更准确的说,newspaper是一个Python的库,只不过这个库由第三方开发,可以归为一种框架

      7.goose本来是一款用Java写的文章提取工具,Xavier grangier用Python从写了goose,并且将重写后的goose命名为Python-goose,Python-goose框架实现的功能同样是进行文章提取

    15.客户端在使用https方式与web服务器通信时的几个步骤

      1.客户使用https的url访问web服务器,要求与web服务器建立ssl连接

      2.web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端

      3.客户端的浏览器与web服务器开始协商ssl连接的安全等级,也就是信息加密的等级

      4.客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并且传送给网站

      5.web服务器利用自己的私钥解密出会话密钥

      6.web服务器利用会话密钥加密与客户端之间的通信

        

  • 相关阅读:
    739. Daily Temperatures
    535. Encode and Decode TinyURL
    811. Subdomain Visit Count
    706. Design HashMap
    C++-static作用(转)
    大学四年应当如何渡过(转)
    计算机导论第八章-总结
    计算机导论第四章习题
    计算机导论-第一章习题
    20世纪最伟大的十大算法
  • 原文地址:https://www.cnblogs.com/kangjunhao/p/9687245.html
Copyright © 2011-2022 走看看