精华内容
下载资源
问答
  • 一、网络数据采集 1.什么是网络数据采集 “网络数据采集”是指利用互联网搜索引擎技术实现有针对性、行业性、精准性的数据抓取,...各种采集日志和采集源日志监控。 支持采集网站、采集源管理。 支持采集图片、附件、音

    一、网络数据采集
    1.什么是网络数据采集
    “网络数据采集”是指利用互联网搜索引擎技术实现有针对性、行业性、精准性的数据抓取,并按照一定规则和筛选标准进行数据归类,并形成数据库文件的一个过程。

    2.网络数据采集的特点
    支持自定义表单。
    支持自适应采集。
    支持集群采集。
    支持各种报表导出。
    支持仿人工式的随机采集数据。
    支持自定义阅读模板。
    支持登陆、代理采集。
    支持各种列表分页采集。
    支持各种内容分页采集。
    支持各种排重过滤。
    各种采集日志和采集源日志监控。
    支持采集网站、采集源管理。
    支持采集图片、附件、音频,视频等文件或附件。附件与正文自动映射与关联。
    支持多种附件保存方式,可保存至磁盘或数据库。
    支持附件的压缩存储。
    支持对采集来的信息进行二次加工。支持采集内容的自动排版。
    真正的多用户采集系统,每个操作都要记录操作内容、操作人以及操作时间。
    真正的多线层、多任务采集、集群采集。
    图形监控网络使用情况、采集情况等。
    支持海量数据采集。
    软件实用、易用、功能强大。
    可移植、可扩展、可定制。
    Python 给人的印象是抓取网页非常方便,提供这种生产力的,主要依靠的就是 urllib、requests这两个模块。

    这里重点介绍requests模块。

    二、网络数据采集之urllib库
    官方文档地址:https://docs.python.org/3/library/urllib.html
    urllib库是python的内置HTTP请求库,包含以下各个模块内容:
    (1)urllib.request:请求模块
    (2)urllib.error:异常处理模块
    (3)urllib.parse:解析模块
    (4)urllib.robotparser:robots.txt解析模块

    urlopen进行简单的网站请求,不支持复杂功能如验证、cookie和其他HTTP高级功能,若要支持这些功能必须使用build_opener()函数返回的OpenerDirector对象。

    很多网站为了防止程序爬虫爬网站照成网站瘫痪,会需要携带一些headers头部信息才能访问, 我们可以通过urllib.request.Request对象指定请求头部信息.

    from urllib.request import urlopen, Request
     
    # 方法一: 通过get方法请求url
    with urlopen('http://www.python.org/') as f:
        # 默认返回的页面信息是bytes类型, bytes类型转换成字符串,decode方法。
        print(f.read(300).decode('utf-8'))
     
    #  方法二: Request对象发起请求
    user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
    # 封装请求头部信息, 模拟浏览器向服务器发起请求
    request = Request('http://www.python.org/', headers={'User-Agent': user_agent})
    with urlopen(request) as f:
        # 默认返回的页面信息是bytes类型, bytes类型转换成字符串,decode方法。
        print(f.read(300).decode('utf-8'))
    
    

    运行结果如下:
    在这里插入图片描述
    三、网络数据采集之requests库
    1.requests安装
    requests官方网址: https://requests.readthedocs.io/en/master/
    安装:

    pip install -i http://pypi.douban.com/simple requests
    

    3.response对象汇总

    from urllib.error import HTTPError
     
    import requests
     
     
    def get():
        # get方法可以获取页面数据,也可以提交非敏感数据
        # url = 'http://127.0.0.1:5000/'
        # url = 'http://127.0.0.1:5000/?username=fentiao&page=1&per_page=5'
        url = 'http://127.0.0.1:5000/'
        try:
            params = {
                'username': 'lucky',
                'page': 1,
                'per_page': 5
            }
            response = requests.get(url, params=params)
            print(response.text, response.url)
            # print(response)
            # print(response.status_code)
            # print(response.text)
            # print(response.content)
            # print(response.encoding)
        except HTTPError as e:
            print("爬虫爬取%s失败: %s" % (url, e.reason))
     
     
    def post():
        url = 'http://127.0.0.1:5000/post'
        try:
            data = {
                'username': 'admin',
                'password': 'westos12'
            }
            response = requests.post(url, data=data)
            print(response.text)
        except HTTPError as e:
            print("爬虫爬取%s失败: %s" % (url, e.reason))
     
     
    if __name__ == '__main__':
        get()
        # post()
    
    

    四.高级应用一:添加headers
    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错

    headers = {'User=Agent':useragent}
    response = requests.get(url, headers = heders)
    

    UserAgent是识别浏览器的一串字符串,相当于浏览器的身份证,在利用爬虫爬取网站数据时,频繁更换UserAgent可以避免触发相应的反爬机制。
    fake-useragent对频繁更换UserAgent提供了很好的支持,可谓防反扒利器。

    # 用户代理
    import requests
    from fake_useragent import UserAgent
     
    def add_headers():
        """
        封装一个请求头部,获取页面的时候加进去,get,post都可以
        不同的浏览器 请求头部不同
        """
        #谷歌浏览器的请求头部 拷贝过来
        # headers= {'user_Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'}
        # 默认情况下python爬虫的用户代理是:客户端请求的user_agent: python-requests/2.22.0
     
        ua = UserAgent() # 从网络获取所有的用户代理
        # print(ua.random) #可以随机拿出一个用户代理
        headers = {'user_Agent': ua.random}
        response = requests.get('http://127.0.0.1:5000', headers=headers)
        print(response)
     
    if __name__ == '__main__':
        add_headers()
    
    

    五.高级应用二:IP代理设置
    在进行爬虫爬取时,有时候爬虫会被服务器给屏蔽掉,这时采用的方法主要有降低访问时间,通过代理IP访问。ip可以从网上抓取,或者某宝购买。

    proxies = { "http": "http://127.0.0.1:9743", "https": "https://127.0.0.1:9743",} 
    response = requests.get(url, proxies=proxies)
    
    # IP代理
    import requests
    from fake_useragent import UserAgent
     
    ua = UserAgent()
    # 代理IP
    proxies = {
        'http':'http://222.95.144.65:3000',
        'https':'https://182.92.220.212:8080'
    }
    response = requests.get('http://47.92.255.98:8000',
                 headers = {'User-Agent':ua.random},
                 proxies = proxies)
     
    print(response)
    # 这是因为服务器端会返回数据:get提交的数据和请求的客户端ip
    #如何判断是否成功:返回的客户端IP刚好是代理IP
    print(response.text)
    

    六.项目案例一:京东商品的爬取
    在这里插入图片描述

    from urllib.error import HTTPError
     
    import requests
    from colorama import Fore
    from fake_useragent import UserAgent
     
     
    def download_page(url, parmas=None):
        try:
            ua = UserAgent()
            headers = {'User-Agent': ua.random}
            response = requests.get(url, params=parmas, headers=headers)
        except  HTTPError as e:
            print(Fore.RED + '[-] 爬取网站%s失败: %s' % (url, e.reason))
            return None
        else:
            # content返回的是bytes类型
            return response.content
     
     
    def download_file(content=b'', filename='hello.html'):
        """
        :param content: 要写入本地的html字符bytes类型
        :param filename: 写入本地的文件名
        :return:
        """
        with open(filename, 'wb') as f:
            f.write(content)
            print(Fore.GREEN + '[+]写入文件%s成功' % (filename))
     
     
    if __name__ == '__main__':
        # url = 'https://item.jd.com/100012015170.html'
        # html = download_page(url)
        # download_file(content=html)
        url = 'https://www.so.com/s'
        params = {
            'q': 'python'
        }
        content = download_page(url, params)
        download_file(content)
    
    

    测试结果:
    在这里插入图片描述
    七.项目案例二:百度/360搜索关键字提交百度/360搜索关键字提交
    百度的关键词接口:https://www.baidu.com/baidu?wd=xxx&tn=monline_4_dg
    360的关键词接口:http://www.so.com/s?q=keyword
    在这里插入图片描述

    from urllib.error import HTTPError
    from colorama import Fore
    import requests
    from fake_useragent import UserAgent
     
    def download_page(url, params=None):
            try:
                ua = UserAgent()
                headers = {'User-Agent': ua.random}
                response = requests.get(url, params=params, headers = headers)
            except HTTPError as e:
                print(Fore.RED + '[-] 爬取网站失败:%s' %(url, e.reason) )
                return None
            else:
                return response.content  #content 返回的是bytes类型
     
    def download_file(content = b'' ,filename='craw.html'):
        """
        :param filename: 写入本地的文件名
        :param content: 要写入本地的html字符串  bytes类型
        :return:
        """
        with open(filename, 'wb') as f:
            f.write(content)
            print(Fore.GREEN+'[+] 写入文件%s成功' %(filename))
     
    if __name__ == '__main__':
        url = 'https://www.so.com/s'
        params = {
            'q':'python'
        }
        content = download_page(url,params)
        download_file(content)
    
    

    测试结果:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • python爬虫基础库要求,美丽的汤,xpath,Selenium,代理池,部分网站爬虫等... 网络基础知识,tcp / ip协议与http协议等... leetcode枚举类算法练习 leetcode链表类算法练习 leetcode哈希表类算法练习 leetcode栈类...
  • -芹菜的实时监控器和Web管理员。 -Django Admin-Interface的爵士外观。 一个Django应用,可为Python脚本创建自动的Web UI。 算法和设计模式 Python实现的算法和设计模式。 -Python中数据结构和算法的最少示例。 ...
  • Python实现个人微信号自动监控告警

    千次阅读 2018-08-10 14:47:44
    Python监控80端口通过web登录微信告警,wechat_sender 是基于 wxpy 和 tornado 实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息 (日志、报警、运行结果等) 发送到微信的工具。运行环境Python 2.7 及...

    wechat_sender 是基于 wxpytornado 实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息 (日志、报警、运行结果等) 发送到微信的工具。

    运行环境

    Python 2.7 及以上 Python 3 及以上

    实现过程

    • 安装 pip 工具
    [root@server1 ~]# wget https://bootstrap.pypa.io/get-pip.py
    [root@server1 ~]# python get-pip.py 
    

    这里写图片描述

    • pip 安装模块
    ##安装依赖软件
    [root@server1 ~]# yum install -y gcc python-devel
    ##安装
    [root@server1 ~]# pip install wechat_sender
    

    Web登录微信发送消息

    • 安装web服务器
    [root@server1 ~]# yum install -y httpd
    [root@server1 ~]# systemctl start http
    [root@server1 ~]# systemctl stop firewalld
    
    [root@server1 ~]# cat /var/www/html/index.html
    <html>
    <head><meta http-equiv="refresh" content="2"></head>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    <body>
    <img src="/qr.png">
    </body>
    </html>
    
    • python脚本代码
    [root@server1 ~]# cat  /var/www/html/sender.py
    #!/bin/bash/env python
    #coding:utf-8
    
    from wxpy import *
    from wechat_sender import *
    from wechat_sender import Sender
    
    #bot = Bot()   ##windows直接扫
    #下面这个是服务器版(Linux)
    #bot = Bot(qr_path="qr.png")
    #避免重复登录重复扫二维码
    bot = Bot(qr_path="qr.png",cache_path=True)
    ##通过文件助手给登录的微信号发消息
    bot.file_helper.send('Hello world!')
    
    • web登录微信
    ##执行python脚本,占用终端,web登录后会有提示
    [root@server1 ~]# cd /var/www/html/
    [root@server1 ~]# python  sender.py  
    Getting uuid of QR code.
    Downloading QR code.
    xdg-open: no method available for opening 'qr.png'
    Please scan the QR code to log in.
    
    • 另一方面,打开浏览器输入 ip or localhost,微信扫一扫
      这里写图片描述
    • 微信登录后,终端释放,提示成功,消息同时发送,并且web二维码失效
    Login successfully as someone
    
    • 微信点击确认
      这里写图片描述

    • 查看手机助手,消息已经收到!
      这里写图片描述

    监控80端口,自动告警

    若是web服务也是80端口,请先登录成功后,如下操作。

    • shell脚本
    [root@server1 ~]# cat /var/www/html/check_80.sh 
    #!/bin/sh
    
    x=$(netstat -antlp | grep '\<80\>'|awk -F' ' '{print $4}'|awk -F: '{print $2}')
    
    if [ "$x" != 80 ];then
    	python /var/www/html/check_80.py &
    else
    	python /var/www/html/check01_80.py &
    fi
    ##添加执行权限
    [root@server1 ~]# chomd +x /var/www/html/check_80.sh
    
    [root@server1 ~]# cat /var/www/html/check01_80.py 
    #!/bin/sh/env python
    #coding:utf-8
    
    from wxpy import *
    from wechat_sender import *
    from wechat_sender import Sender
    
    bot = Bot(qr_path="qr.png",cache_path=True)
    ##通过文件助手给登录的微信号发消息
    bot.file_helper.send('port 80 nice!')
    
    [root@server1 ~]# cat /var/www/html/check_80.py 
    #!/bin/sh/env python
    #coding:utf-8
    
    from wxpy import *
    from wechat_sender import *
    from wechat_sender import Sender
    
    bot = Bot(qr_path="qr.png",cache_path=True)
    ##通过文件助手给登录的微信号发消息
    bot.file_helper.send('port 80 error!')
    
    [root@server1 ~]# cat /mnt/check.sh 
    #!/bin/sh
    
    cd /var/www/html
    sh check_80.sh
    
    [root@server1 ~]# chmod +x /mnt/check.sh 
    
    • 测试脚本

    1.httpd 服务开启时,端口 80 存在

    [root@server1 ~]# sh /mnt/check.sh 
    

    这里写图片描述
    2.httpd 服务关闭后,端口 80 不存在

    [root@server1 ~]# systemctl stop httpd
    
    [root@server1 ~]# sh /mnt/check.sh 
    

    这里写图片描述

    3.httpd 服务再次开启,端口 80 存在

    [root@server1 ~]# systemctl start httpd
    
    [root@server1 ~]# sh /mnt/check.sh 
    

    这里写图片描述

    [root@server1 ~]# crontab -e
    * 1 * * * sh /mnt/check.sh
    
    • 投入使用
      添加任务计划后,妥善修改脚本,避免频繁告警。
    展开全文
  • wechat_sender 是基于 wxpy 和 tornado 实现的一个可以将你的网站、爬虫、脚本等其他应用中各种消息 (日志、报警、运行结果等) 发送到微信的工具。 运行环境 Python 2.7 及以上 Python 3 及以上 实现过程 安装 pip...
  • 066、爬虫常见问题

    千次阅读 2019-06-01 23:49:21
    1. 怎么监控爬虫的状态 1. 使用 python 的 STMP 包将爬虫的状态信心发送到指定的邮箱 2. Scrapyd、pyspider 3. 引入日志 集成日志处理平台来进行监控,如 elk 2. 列举您使用过的Python 网络爬虫所用到的网络...

    1. 怎么监控爬虫的状态

    1. 使用 python 的 STMP 包将爬虫的状态信心发送到指定的邮箱

    2. Scrapyd、pyspider

    3. 引入日志

    集成日志处理平台来进行监控,如 elk

     

    2. 列举您使用过的Python 网络爬虫所用到的网络数据包?

    requests、urllib、urllib2、httplib2。

     

    3. 列举您使用过的Python 网络爬虫所用到的解析数据包

    Re、json、jsonpath、BeautifulSoup、pyquery、lxml。

     

    4. 爬取数据后使用哪个数据库存储数据的,为什么?

    以下内容适合放在数据库哪里去说。。对于这个问题,建议是:

    一般爬虫使用的数据库,是根据项目来定的。如需求方指定了使用什么数据库、如果没指定,那么决定权就在爬虫程序员手里,如果自选的话,mysql 和 mongodb 用的都是比较多的。但不同的数据库品种有各自的优缺点,不同的场景任何一种数据库都可以用来存储,但是某种可能会更好。比如如果抓取的数据之间的耦合性很高,关系比较复杂的话,那么 mysql 可能会是更好的选择。如果抓取的数据是分版块的,并且它们之间没有相似性或关联性不强,那么可能 mongodb 会更好。。另外主流的几种永

    久存储数据库,都是具备处理高并发、具备存储大量数据的能力的,只是由于各自的实现机制不一样,

    因此优化方案也是不尽相同。总结就是:数据库的选择尽量从项目的数据存在的特性来考虑,还有一个问题就是开发人员最擅长那种数据库。

    MongoDB 是使用比较多的数据库,这里以 MongoDB 为例,大家需要结合自己真实开发环境回答。

    原因:1)与关系型数据库相比,MongoDB 的优点如下。

    ①弱一致性(最终一致),更能保证用户的访问速度

    举例来说,在传统的关系型数据库中,一个 COUNT 类型的操作会锁定数据集,这样可以保证得到“当前”情况下的较精确值。这在某些情况下,例 如通过 ATM 查看账户信息的时候很重要, 但对于 Wordnik 来说,数据是不断更新和增长的,这种“较精确”的保证几乎没有任何意义,反而会产生很大的延 迟。他们需要的是一个“大约”的数字以及更快的处理速度。

    但某些情况下 MongoDB 会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用了下面的优化方式来避免锁定。

    每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/ 从部署方案中,从节点可以使用“-pretouch”参数运行,这也可以得到相同的效果。

    使用多个 mongod 进程。我们根据访问模式将数据库拆分成多个进程。

    ②文档结构的存储方式,能够更便捷的获取数据。

    对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据, 这无论是在查询还是获取数据时都十分困难。

    ③ 内 置 GridFS, 支 持 大 容 量 的 存 储 。GridFS 是一个出色的分布式文件系统,可以支持海量的数据存储。内置了 GridFS 了 MongoDB, 能够满足对大数据集的快速范围查询。

    ④内置 Sharding。

    提供基于 Range 的 Auto Sharding 机制:一个 collection 可按照记录的范围,分成若干个段, 切分到不同的 Shard 上。Shards 可以和复制结合,配合 Replica sets 能够实现 Sharding+fail-over, 不同的 Shard 之间可以负载均衡。查询是对 客户端是透明的。客户端执行查询,统计,MapReduce 等操作,这些会被 MongoDB 自动路由到后端的数据节点。这让我们关注于自己的业务,适当的 时候可以无痛的升级。MongoDB 的 Sharding 设计能力较大可支持约 20 petabytes,足以支撑一般应用。

    这可以保证 MongoDB 运行在便宜的 PC 服务器集群上。PC 集群扩充起来非常方便并且成本很低, 避免了“sharding”操作的复杂性和成本。

    ⑤第三方支持丰富。(这是与其他的 NoSQL 相比,MongoDB 也具有的优势)

    现在网络上的很多 NoSQL 开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险。而开源文档数据库 MongoDB 背后有商业公司 10gen 为其提供供商业培训和支持。

    而且 MongoDB 社区非常活跃,很多开发框架都迅速提供了对 MongDB 的支持。不少知名大公司和网站也在生产环境中使用 MongoDB,越来越多的创新型企业转而使用 MongoDB 作为和

    Django,RoR 来搭配的技术方案。

    ⑥性能优越

    在使用场合下,千万级别的文档对象,近 10G 的数据,对有索引的 ID 的查询不会比 mysql 慢, 而对非索引字段的查询,则是全面胜出。 mysql 实际无法胜任大数据量下任意字段的查询,而

    mongodb 的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,

    mongodb 比我以前试用过的 couchdb 要快得多,基本 10 分钟以下可以解决。补上一句,观察过程中 mongodb 都远算不上是 CPU 杀手。

    2)Mongodb 与 redis 相比较

    ①mongodb 文件存储是 BSON 格式类似 JSON,或自定义的二进制格式。

    mongodb 与 redis 性能都很依赖内存的大小,mongodb 有丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言,redis 数据丰富,较少的 IO ,这方面 mongodb 优势明显。

    ②mongodb 不支持事物,靠客户端自身保证,redis 支持事物,比较弱,仅能保证事物中的操作按顺序执行,这方面 redis 优于 mongodb。

    ③mongodb 对海量数据的访问效率提升,redis 较小数据量的性能及运算,这方面 mongodb 性能优于redis .monbgodb 有mapredurce 功能,提供数据分析,redis 没有 ,这方面 mongodb优 于 redis 。

     

    5. 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?

    Python 自带:urllib、urllib2 第三方:requests,aiohttp 框架: Scrapy、pyspider

    urllib 和urllib2 模块都做与请求 URL 相关的操作,但他们提供不同的功能。

    urllib2:urllib2.urlopen 可以接受一个 Request 对象或者 url,(在接受 Request 对象时候,并以此可以来设置一个 URL 的 headers),urllib.urlopen 只接收一个 url。

    urllib 有urlencode,urllib2 没有,因此总是urllib,urllib2 常会一起使用的原因。

    scrapy 是封装起来的框架,它包含了下载器,解析器,日志及异常处理,基于多线程,twisted 的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取,并发及分布式处理方面,不够灵活,不便调整与括展。

    request 是一个 HTTP 库, 它只是用来,进行请求,对于 HTTP 请求,他是一个强大的库,下载, 解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现

    aiohttp 是一个基于 python3 的 asyncio 携程机制实现的一个 http 库,相比 requests,aiohttp 自身就具备了异步功能。但只能在 python3 环境使用。

    Scrapy 优点:

    scrapy 是异步的;

    采取可读性更强的 xpath 代替正则; 强大的统计和 log 系统;

    同时在不同的 url 上爬行;

    支持 shell 方式,方便独立调试;

    写 middleware,方便写一些统一的过滤器; 通过管道的方式存入数据库;

    Scrapy 缺点:

    基于 python 的爬虫框架,扩展性比较差;

    基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

    Pyspider 是一个重量级的爬虫框架,为什么说重量级?我们知道 scrapy 没有数据库集成、没有分布式、断点续爬的支持、没有 UI 控制界面等等、如果基于 scrapy 想要实现这些功能,都需要自行开发,但 pyspider 都已经集成了。但也正因如此 pyspider 另一个问题就是,扩展性太差,学习难度较大

     

    6. 写爬虫是用多进程好?还是多线程好? 为什么?

    phantomjs 或者chrome-headless 来抓取的爬虫,应当是多进程的,因为每一个

    phan/chro 实例就是一个进程了,并发只能是多进程。。此外爬虫中还是数据处理业务,如果数据处理业务是一个比较耗时的计算型操作,那么对数据处理部分应当设为多进程,但更多可能会考虑将该部分数据处理操作和爬虫程序解耦,也就是先把数据抓取下来,事后单独运行另外的程序解析数据。

     

    7. 常见的反爬虫和应对方法?

    反爬虫简单的说指的是:网站根据某些因素断定该请求是一个爬虫程序发出的请求,然后对该请求采取了一定的制裁措施。

    因此反爬虫应该从两方面来探讨:

    1. 网站如何断定该请求是一个爬虫:

    请求头、请求频率、IP 地址、cookie 等(持续更新请求头、cookie、用户 cookie 池、代理 IP 池、设置一定的延时)

    2. 网站如何制裁这个它认为是爬虫的请求(假数据、空数据、不返回响应、验证码、4xx 状态码等)

    通过 Headers 反爬虫:

    从用户请求的 Headers 反爬虫是最常见的反爬虫策略。很多网站都会对 Headers 的 User-Agent 进行检测,还有一部分网站会对 Referer 进行检测(一些资源网站的防盗链就是检测 Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加 Headers,将浏览器的 User-Agent 复制到爬虫的

    Headers 中;或者将 Referer 值修改为目标网站域名。对于检测 Headers 的反爬虫,在爬虫中修改或者添加 Headers 就能很好的绕过。

    基于用户行为反爬虫:

    还有一部分网站是通过检测用户行为,例如同一 IP 短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。

    大多数网站都是前一种情况,对于这种情况,使用 IP 代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理 ip,检测后全部保存起来。这样的代理 ip 爬虫经常会用到,最好自己准备一个。有了大量代理 ip 后可以每请求几次更换一个 ip,这在 requests 或者 urllib2 中很容易做到,这样就能很容易的绕过第一种反爬虫。

    对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

    动态页面的反爬虫:

    上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过 ajax 请求得到,或者通过 JavaScript 生成的。首先用 Fiddler 对网络请求进行分析。如果能够找到 ajax 请求, 也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用 requests 或者 urllib2 模拟 ajax 请求,对响应的 json 进行分析得到需要的数据。

    能够直接模拟ajax 请求获取数据固然是极好的,但是有些网站把 ajax 请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。这种情况下就用 selenium+phantomJS,调用浏览器内核,并利用 phantomJS 执行 js 来模拟人为操作以及触发页面中的 js 脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

    用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加

    Headers 一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS 就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利 selenium+phantomJS 能干很多事情,例如识别点触式

    (12306)或者滑动式的验证码,对页面表单进行暴力破解等。

     

    8. 需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?

    解决限制 IP 可以使用代理 IP 地址池、服务器;

    不适用动态爬取的情况下可以使用反编译 JS 文件获取相应的文件,或者换用其他平台(比如手机端) 看看是否可以获取相应的 json 文件。

     

    9. 验证码的解决?

    图形验证码:干扰、杂色不是特别多的图片可以使用开源库 Tesseract 进行识别,太过复杂的需要借助第三方打码平台。

    点击和拖动滑块验证码可以借助 selenium、无图形界面浏览器(chromedirver 或者 phantomjs) 和 pillow 包来模拟人的点击和滑动操作,pillow 可以根据色差识别需要滑动的位置。

    手动打码(有的验证码确实无解)

     

    10. 使用最多的数据库(Mysql,Mongodb,redis 等),对他们的理解?

    MySQL 数据库:开源免费的关系型数据库,需要实现创建数据库、数据表和表的字段,表与表之间可以进行关联(一对多、多对多),是持久化存储。

    Mongodb 数据库:是非关系型数据库,数据库的三元素是,数据库、集合、文档,可以进行持久化存储,也可作为内存数据库,存储数据不需要事先设定格式,数据以键值对的形式存储。

    redis 数据库:非关系型数据库,使用前可以不用设置格式,以键值对的方式保存,文件格式相对自由,主要用与缓存数据库,也可以进行持久化存储。

     

    11. 字符集和字符编码

    字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。

    字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:

    ASCII 字符集、ISO 8859 字符集、GB2312 字符集、BIG5 字符集、GB18030 字符集、Unicode 字符集等。

    字符编码就是以二进制的数字来对应字符集的字符。常见的编码字符集(简称字符集)如下所示:

    Unicode:也叫统一字符集,它包含了几乎世界上所有的已经发现且需要使用的字符

    (如中文、日文、英文、德文等)。

    ASCII:ASCII 既是编码字符集,又是字符编码。早期的计算机系统只能处理英文,所以 ASCII 也就成为了计算机的缺省字符集,包含了英文所需要的所有字符。

    GB2312:中文字符集,包含 ASCII 字符集。ASCII 部分用单字节表示,剩余部分用双字节表示。

    GBK:GB2312 的扩展,但完整包含了 GB2312 的所有内容。

    GB18030:GBK 字符集的超集,常叫大汉字字符集,也叫 CJK(Chinese,Japanese, Korea)字符集,包含了中、日、韩三国语。

    注意:Unicode 字符集有多种编码方式,如 UTF-8、UTF-16 等;ASCII 只有一种;大多数 MBCS(包括 GB2312)也只有一种。

     

    12. 写一个邮箱地址的正则表达式?

    [A-Za-z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

     

    13. 编写过哪些爬虫中间件?

    user-agent、代理池等。

     

    14. “极验”滑动验证码如何破解?

    1. selenium 控制鼠标实现,速度太机械化,成功率比较低

    2. 计 算 缺 口 的 偏 移 量 ( 推 荐 博 客 : http://blog.csdn.net/paololiu/article/details/52514504?%3E

    3. “极验”滑动验证码需要具体网站具体分析,一般牵扯算法乃至深度学习相关知识。

     

    15. 爬的那些内容数据量有多大,多久爬一次,爬下来的数据是怎么存储?

    京东整站的数据大约在 1 亿左右,爬下来的数据存入数据库,mysql 数据库中如果有重复的 url 建议去重存入数据库,可以考虑引用外键。评分,评论如果做增量,Redis 中 url 去重,评分和评论建议建立一张新表用 id 做关联。

    多久爬一次这个问题要根据公司的要求去处理,不一定是每天都爬。

    Mongo 建立唯一索引键(id)可以做数据重复 前提是数据量不大 2 台电脑几百万的情况 数据库需要做分片 (数据库要设计合理)。

    例:租房的网站数据量每天大概是几十万条 ,每周固定爬取。

     

    16. cookie 过期的处理问题?

    因为 cookie 存在过期的现象,一个很好的处理方法就是做一个异常类,如果有异常的话 cookie 抛出异常类在执行程序。

     

    17. 动态加载又对及时性要求很高怎么处理?

    分析出数据接口 API(利用 chrome 或者抓包工具),然后利用 requests 等 http 库实现爬虫,如果有需要执行 js 代码,可借助 js2py、pyexecjs 等工具实现。

    Selenium+Phantomjs

    尽量不使用 sleep 而使用 WebDriverWait

     

    18. HTTPS 有什么优点和缺点

    优点:

    1、使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

    2、HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

    3、HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击

    的成本

    缺点:

    1. HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用

    2. HTTPS 协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。

    3. SSL 证书需要钱。功能越强大的证书费用越高。个人网站、小网站没有必要一般不会用。

    4. HTTPS 连接服务器端资源占用高很多,握手阶段比较费时对网站的相应速度有负面影响。

    5. HTTPS 连接缓存不如 HTTP 高效。

     

    19. HTTPS 是如何实现安全传输数据的。

    HTTPS 其实就是在HTTP 跟TCP 中间加多了一层加密层TLS/SSL。SSL 是个加密套件,负责对 HTTP 的数据进行加密。TLS 是 SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。原先是应用层将数据直接给到 TCP 进行传输,现在改成应用层将数据给到 TLS/SSL,将数据加密后,再给到 TCP 进行传输。

     

    20. TTL,MSL,RTT?

    MSL:报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

    TTL:TTL 是 time to live 的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个 ip 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。RFC 793 中规定 MSL 为 2 分钟,实际应用中常用的是 30 秒,1 分钟和 2 分钟等。TTL 与 MSL 是有关系的但不是简单的相等的关系,MSL 要大于等于 TTL。

    RTT: RTT 是客户到服务器往返所花时间(round-trip time,简称 RTT),TCP 含有动态估算 RTT 的算法。TCP 还持续估算一个给定连接的 RTT,这是因为 RTT 受网络传输拥塞程序的变化而变化。

     

    21. 谈一谈你对Selenium 和PhantomJS 了解

    Selenium 是一个 Web 的自动化测试工具,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行, 所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。Selenium 库里有个叫 WebDriver 的

    API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他

    Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。

    PhantomJS 是一个基于 Webkit 的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。相比传统的 Chrome或 Firefox 浏览器等,资源消耗会更少。

    如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScript、Cookie、headers,以及任何我们真实用户需要做的事情。

    主程序退出后,selenium 不保证 phantomJS 也成功退出,最好手动关闭 phantomJS 进程。(有可能会导致多个 phantomJS 进程运行,占用内存)。

    WebDriverWait 虽然可能会减少延时,但是目前存在 bug(各种报错),这种情况可以采用 sleep。

    phantomJS 爬数据比较慢,可以选择多线程。如果运行的时候发现有的可以运行,有的不能,可以尝试将 phantomJS 改成 Chrome。

     

    22. 代理 IP 里的“透明”“匿名”“高匿”分别是指?

    透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的 IP。你要想隐藏的话,不要用这个。

    普通匿名代理能隐藏客户机的真实 IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的 ip 地址,但仍然可以知道你在使用代理,当然某些能够侦测 ip 的网页仍然可以查到你的 ip。

    高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实 IP 是隐藏的,服务器端不会认为我们使用了代理。

    设置代理有以下两个好处:

    1,让服务器以为不是同一个客户端在请求

    2,防止我们的真实地址被泄露,防止被追究

     

    23. requests 返回的 content 和text 的区别?

    23. requests 返回的 content 和text 的区别?

    a)response.text 返回的是 Unicode 型数据;

    a) response.content 返回的是 bytes 类型,也就是二进制数据;

    b) 获取文本使用,response.text;

    b) 获取图片,文件,使用 response.content; c)response.text

    类型:str

    解码类型: 根据 HTTP 头部对响应的编码作出有根据的推测,推测的文本编码如何修改编码方式:response.encoding=”gbk”

    c) response.content 类型:bytes

    解码类型: 没有指定

    如何修改编码方式:response.content.decode(“utf8”)

     

    24. robots 协议

    Robots 协议:网站通过 Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

     

    25. 为什么requests 请求需要带上header?

    让我们的爬虫请求看起来就是一个正常的浏览器请求

    原因是:模拟浏览器,欺骗服务器,获取和浏览器一致的内容

    header 的形式:字典

    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

    用法: requests.get(url,headers=headers)

     

    26. dumps,loads 与dump,load 的区别?

    json.dumps()将 pyhton 的 dict 数据类型编码为 json 字符串;

    json.loads()将 json 字符串解码为 dict 的数据类型;

    json.dump(x,y) x 是 json 对象, y 是文件对象,最终是将 json 对象写入到文件中;

    json.load(y) 从文件对象 y 中读取 json 对象。

     

    27. 通用爬虫 :通常指搜索引擎的爬虫

    聚焦爬虫 :针对特定网站的爬虫

    通用搜素引擎的局限性:

    通用搜索引擎所返回的网页里 90%的内容无用。

    图片、数据库、音频、视频多媒体的内容通用搜索引擎无能为力。不同用户搜索的目的不全相同,但是返回内容相同。

     

    28. requests 使用小技巧

    1、reqeusts.util.dict_from_cookiejar 把 cookie 对象转化为字典

     requests.get(url,cookies={})

    2、设置请求不用 SSL 证书验证

    response = requests.get("https://www.12306.cn/mormhweb/ ", verify=False)

    3、设置超时

    response = requests.get(url,timeout=10)

    4、配合状态码判断是否请求成功

    assert response.status_code == 200

     

    29. 平常怎么使用代理的 ?

    1. 自己维护代理池

    2. 付费购买(目前市场上有很多 ip 代理商,可自行百度了解,建议看看他们的接口文档(API&SDK))

     

    30. IP 存放在哪里?怎么维护 IP?对于封了多个 ip 的,怎么判定 IP 没被封?

    存放在数据库(redis、mysql 等)。维护多个代理网站:

    一般代理的存活时间往往在十几分钟左右,定时任务,加上代理 IP 去访问网页,验证其是否可用, 如果返回状态为 200,表示这个代理是可以使用的。

     

    31. 怎么获取加密的数据?

    1. Web 端加密可尝试移动端(app)

    2. 解析加密,看能否破解

    3. 反爬手段层出不穷,js 加密较多,只能具体问题具体分析

    分析前端 js 文件,找到加密解密数据的 js 代码,用 Python 代码实现或者利用 js2py 或 pyexecjs 等执行 js 代码

     

    32. 假如每天爬取量在 5、6 万条数据,一般开几个线程,每个线程 ip 需要加锁限定吗?

    1. 5、6 万条数据相对来说数据量比较小,线程数量不做强制要求(做除法得一个合理值即可)

    2. 多线程使用代理,应保证不在同时一刻使用一个代理 IP

    3. 一般请求并发量主要考虑网站的反爬程度来定。

     

    展开全文
  • Python 基础语法 Python 基础进阶 Python 编程技巧 Python 收集系统信息 Web 架构 Django 监控系统二次开发 ...Python 管理 MySQL ...主机性能监控 ...Python 网络爬虫 Python 算法          ...
    1. Python 基础语法
    2. Python 基础进阶
    3. Python 编程技巧
    4. Python 收集系统信息
    5. Web 架构 Django
    6. 监控系统二次开发
    7. 大规模主机管理
    8. Python 管理 MySQL
    9. 主机性能监控
    10. 分布式监控系统
    11. 日志分析系统
    12. Jenkins 代码管理
    13. Python 管理虚拟机
    14. Python 网络爬虫
    15. Python 算法

     

     

     

     

        

    展开全文
  • Python3.6学习笔记

    2018-01-22 22:46:59
    Python3.6学习笔记 Python中级篇 Web App 揭秘Python编程技巧 收集系统信息 Web架构Django 监控系统二次开发 ...构建最前沿日志分析系统 Jenkins代码管理 Python管理虚拟机 Pyhton网络爬虫 Python算法 ...
  • awesome-python 是 vinta 发起维护的 Python 资源列表,内容包括:Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等。由「开源前哨...
  • 志兴python爬虫,获取知行论坛十大 基础 python基础教程的ppt 喜欢请star 列个列表,以后慢慢写,10min系列,欢迎大家添加这个列表,我会慢慢写 爬虫pc的知乎专栏,生成pdf 爬虫模拟登录 重新启动定制版交换机...
  • 从 Scrapy 的部署、启动到监控日志查看,我们只需要鼠标键盘点几下就可以完成,那岂不是美滋滋?更或者说,连 Scrapy 代码都可以帮你自动生成,那岂不是爽爆了?有需求就有动力,没错,Gerapy 就是为此而生的,...
  • Crawlab是一个基于Golang的分布式爬虫管理平台,支持Python、NodeJS、Go、Java、PHP等多种编程语言以及多种爬虫框架。 Crawlab架构: Crawlab的架构包括了一个主节点(Master Node)和多个工作节点(Worker Node),...
  • linux进程监控重启shell脚本

    千次阅读 2017-08-30 09:05:49
    前段时间工作需要使用python+scrapy写了个新闻舆情爬虫系统,服务器上面跑了大概5个月,期间莫名其妙的挂了2~3次。最终决定使用shell一直监控指定的进程,如果没有运行,则重新启动重新。相信监控重新是否运行,如果...
  • 14.8.4 日志监控服务 327 14.9 没有万无一失的系统 328 14.10 小结 328 第15 章 结论 330 15.1 数据处理者的职责 330 15.2 数据处理之上 331 15.2.1 成为一名更优秀的数据分析师 331 ...
  • 山东大学(威海)教务处工作通知监控 项目简介 本项目有用爬取山东大学威海校区教务处网站工作通知并发送邮件进行通知 使用方法 1.安装python环境(开发环境为3.8.2) 2.配置config.json2.Windows下双击run.bat 2.1....
  • Python爬虫 Python操作MySql数据库 使用Flask构建web项目 基于Echarts的数据可视化展示 在Linux上部署web项目以及定时获取数据 nCov数据可视化大屏流程: 项目结构安排: ├── app.py #Flask启动文件 ├── ...
  • 索引

    2017-07-25 12:58:00
    LogParser v0.8.0 发布:一个用于定期增量式解析 Scrapy 爬虫日志Python 库,配合 ScrapydWeb 使用可实现爬虫进度可视化 如何免费创建云端爬虫集群 时隔五年,Scrapyd 终于原生支持 basic auth JS 分析 ***...
  • Linux运维常用命令----持续更新

    万次阅读 多人点赞 2018-05-30 10:36:10
    日常工作就是写脚本、测试、部署、服务器环境配置、数据流监控、脚本运行状况监控等我想说其实我还同时持续着我的爬虫工作,于是乎稍微总结一下运维这段时间常用的操作指令1、查看当前目录下所有文档的内容行数2、...
  • 爬虫 String 正则表达式 日志 log4j Maven Eclipse excel (POI不可操作CSV文件) Spring Database mysql misc sql 隔离级别 join index 数据类型 触发器 事务 postgresql Data Structure & Algorithm cpp Linux ...
  • 本项目使用的编程语言是python3,数据库用的是MySQL, 主要用到的库是celery和requests,并实现了定时任务,出错重试,日志记录,自动更改Cookies等的功能,使用ECharts + Bootstrap 来构建前端页面。 展示页面 ...
  • 构建工具、字节码操作、集群管理、代码分析、编译器生成工具、外部配置工具、持续集成、数据结构、数据库、时间日期工具库、依赖注入、开发流程...JVM与JDK、日志、机器学习、消息传递、应用监控工具、自然语言处理等...
  • python 学习持续更新 ElasticSearch 笔记 kafka storm 实战 (干货) scala 学习持续更新 RPC 深度学习 GO 语言 持续更新 更多干货 React 入门实战(干货) 分布式实战(干货) spring cloud 实战...
  • Python爬虫:人人影视追剧脚本 爬取大西洋月刊每日新闻 (补充)爬取大西洋月刊并 使用彩云小译翻译 API 脚本 数据分析篇 Data Science - Quora How to learn data analysis with Python - Quora 之前写过的...
  • 主要技术实现:Python爬虫/IP代理池/JS接口爬取/Selenium页面爬取 申明:本脚本没有涉及某东账号登录,没有大批量抓取某东敏感信息,仅抓取商品名称和价格,如有任何敏感问题,请联系我删除。 README文档导航 若您...
  • 15.Python爬虫妹子图 17.自定义进度条 18.自定义折叠和展开布局 19.商品详情页分页加载 20.在任意View控件上设置红点控件 21.仿抖音一次滑动一个页面播放视频库 17.2 感谢参考案例和博客 exo播放器 ...
  • 后续有积极的爬虫工具需求也可以和作者私信询问 江湖再见 祝大家早点买到口罩 避免抢购,程序自动一次只买一件 V2版本(已不更新) 请在configDemo.ini 加入商品id、地区id、cookie等参数 区分下单模式(默认2...
  • CVE-2020-2546,CVE-2020-2915 CVE-2020-2801 CVE-2020-2798 CVE-2020-2883 CVE-2020-2884 CVE-2020-2950 WebLogic T3 payload exploit poc python3|CVE-2020-2883-Weblogic coherence.jar RCE|WebLogic-Shiro-shell...
  • 昨天的那个疑似爬虫的 IP 地址又出现了;</li><li><code>cardinality</code>:线上的 API 服务器突然挂了一台,它是根据唯一值的数量来判定的;</li></ul> 报警通知配置 目前它提供了 10 ...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

python爬虫日志监控

python 订阅
爬虫 订阅