• python——爬虫


    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

    爬虫:

      客户端:

        Web应用本质

        APP

      服务器:

        URL -> API

     注:服务器提供API,URL有个专有名词叫API

    自动程序(爬虫):

      起始URL:

        https://www.cnblogs.com/

        下载源码:

    <!DOCTYPE html>
        <html lang="zh-cn">
        <head>
            <meta name="viewport" content="width=device-width, initial-scale=1"><meta charset="utf-8">
            <title>博客园 - 开发者的网上家园</title>
            <meta name="k
            ...
    

         --- 获取关键字,收录到数据库 -

        -- 再获取其他URL,href

        再继续访问......

      requests.post(...)

    自动登录需要注意几点:

    1、登录时提交用户信息

    2、接收返回值或者cookie

    3、携带cookie或者返回值,再去访问

    自动登录网站的几种认证方式:

      第一次获取cookie

        登录:cookie授权

      ....

      第一次访问:什么都不给

        登录:登录成功后,再给字符串

    python爬虫几个步骤:

    1、发送请求

      - 需要验证

      - 无需验证

    2、获取内容

      正则表达式,分类+分组

      //div[@class='item_list']

      //div[@class='item_list']/div

      //div[@class='item_list']//span

      //div[@class='item_list']//a/text()

      //div[@class='item_list']//img/@

    3、获取其他URL

      //a/@href

    4、自动递归请求url,重复执行1、2、3步操作

    ##############scrapy##############

     1、安装

      依赖:Twisted

      基于python2.7做

      

      pip install scrapy

      windows依赖模块:

            pywin32

      安装python2.7

        python-2.7.11.msi

        python-2.7.11.adm64.msi

        ==> 环境变量 C:python27   C:python27Script

      装pip

      安装steuptools 

        https://bootstrap.pypa.io/ez_setup.py

        ez_setup.py

        python ez_setup.py

      pip(下载pip源码进行解压安装)

        https://pypi.python.org/packages/11/b6/abcb525026a4be042b486df43905d6893fb04f05aac21c32c638e939e447/pip-9.0.1.tar.gz#md5=35f01da33009719497f01a4ba69d63c9

        解压

        进入模块

        python setup.py install

      pip install requests

      pip install scrapy

        scrapy需要装的一些依赖:

          VCForPython27.msi

          pywin32-220.win-amd64-py2.7.exe

          pypiwin32-219.win32-py2.7.exe

          lxml-2.3.win-amd64-py2.7.exe

          lxml-2.3.win32-py2.7.exe

        

        pip install scrapy

    2、使用

      环境变量:C :python27scrapy

      scrapy startproject spiderl

      创建spider文件(APP)

        -name = ''nnnnn"

        -start_urls

        -parse

    3、 scrapy crawl spider_name --nolog    #nolog不要显示日志

     **********************

    scrapy

    1、project

    2、app,爬虫

      - name

      - start_urls

      - parse

    3、crawl name --nolog

    4、parse

      直接处理请求:

        selector:

          //   #表示子子孙孙

          /  #从孩子里找

          //div[@class='c1']   #表示属性选择器

          //div[@class='c1'][@id='i1']   #两个属性

          //div//img/@src     获取img下的src属性

          //div//a[1]

          //div//a[1]//text()  #找a标签里面内容

          ====支持正则表达式

          //div/a


    Requests

    Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

    import urllib2
    import json
    import cookielib
    
    
    def urllib2_request(url, method="GET", cookie="", headers={}, data=None):
        """
        :param url: 要请求的url
        :param cookie: 请求方式,GET、POST、DELETE、PUT..
        :param cookie: 要传入的cookie,cookie= 'k1=v1;k1=v2'
        :param headers: 发送数据时携带的请求头,headers = {'ContentType':'application/json; charset=UTF-8'}
        :param data: 要发送的数据GET方式需要传入参数,data={'d1': 'v1'}
        :return: 返回元祖,响应的字符串内容 和 cookiejar对象
        对于cookiejar对象,可以使用for循环访问:
            for item in cookiejar:
                print item.name,item.value
        """
        if data:
            data = json.dumps(data)
    
        cookie_jar = cookielib.CookieJar()
        handler = urllib2.HTTPCookieProcessor(cookie_jar)
        opener = urllib2.build_opener(handler)
        opener.addheaders.append(['Cookie', 'k1=v1;k1=v2'])
        request = urllib2.Request(url=url, data=data, headers=headers)
        request.get_method = lambda: method
    
        response = opener.open(request)
        origin = response.read()
    
        return origin, cookie_jar
    
    
    # GET
    result = urllib2_request('http://127.0.0.1:8001/index/', method="GET")
    
    # POST
    result = urllib2_request('http://127.0.0.1:8001/index/',  method="POST", data= {'k1': 'v1'})
    
    # PUT
    result = urllib2_request('http://127.0.0.1:8001/index/',  method="PUT", data= {'k1': 'v1'})
    封装urllib请求

    Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。


    Scrapy

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架(类似Django)。
    其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

    Scrapy用途广泛,例如:

    • 数据挖掘
    • 信息处理
    • 存储历史数据
    • 监测
    • 自动化测试
    • ...

    详细参考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html

    Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下

    Scrapy主要包括了以下组件:

    • 引擎(Scrapy)
      用来处理整个系统的数据流处理, 触发事务(框架核心)
    • 调度器(Scheduler)
      用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    • 下载器(Downloader)
      用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
    • 爬虫(Spiders)
      爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
    • 项目管道(Pipeline)
      负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
    • 下载器中间件(Downloader Middlewares)
      位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
    • 爬虫中间件(Spider Middlewares)
      介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
    • 调度中间件(Scheduler Middewares)
      介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

    Scrapy运行流程大概如下:

      1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
      2. 引擎把URL封装成一个请求(Request)传给下载器
      3. 下载器把资源下载下来,并封装成应答包(Response)
      4. 爬虫解析Response
      5. 解析出实体(Item),则交给实体管道进行进一步的处理
      6. 解析出的是链接(URL),则把URL交给调度器等待抓取

    python爬虫链接详细参考:http://www.cnblogs.com/wupeiqi/articles/5354900.html

    #################################################################

    爬虫博客推荐(python2.7):http://www.cnblogs.com/xin-xin/p/4297852.html

  • 相关阅读:
    Androidproject文件下assets目录与res目录的差别
    tomcat 实现域名crm.test.com訪问
    全文索引--自己定义chinese_lexer词典
    Elasticsearch 之 慘痛部署(分片移位)
    iOS开发核心语言Objective C —— 全部知识点总结
    [LeedCode OJ]#28 Implement strStr()
    【Django】 gunicorn部署纪要
    PKI(公钥基础设施)基础知识笔记
    Cocoapods Undefined symbols for architecture armv7sarm64
    Android开发Tips(3)
  • 原文地址:https://www.cnblogs.com/yard/p/6272289.html
Copyright © 2020-2023  润新知