zoukankan      html  css  js  c++  java
  • 爬虫相关

    网络爬虫:就是抓取网页数据的程序。


    网页三大特征:

    1. 网页都有自己的URL(统一资源定位符)来进行定位,每个网页都有一个唯一的URL
    2. 网页都用HTML(超文本标记语言)来描述页面信息。
    3. 网页都用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。


    爬虫的设计思路:

    1. 首先设定需要爬取的网页的URL地址;
    2. 通过HTTP协议来获取对应的HTML页面;
    3. 提取HTML页面的信息:
    a. 如果有用的数据,那就保存起来;
    b. 如果是需要继续爬取的链接,重新指定第二步。

      

    介绍:

    -1. Python基本语法知识 和 基本Web知识 已经搞定。

    -2 HTML页面的抓取:
    urllib、urllib2、requests三个HTTP请求处理库:
    作用:通过处理,可以模拟浏览器发送HTTP请求,并获取服务器返回的HTML或其他响应页面。

    -3 HTML页面的解析:
    re、xpath、BeautifulSoup4、Jsonpath:
    作用:使用某种描述性语言,指定一个匹配规则,来提取需要的页面数据,符合规则的数据,叫"匹配"。

    -4 动态HTML处理/验证码的处理:
    Selenium+PhantomJS: 模拟真实浏览器加载数据,js 、ajax等..
    Tesseract OCR:光学字符识别系统,识别图像的内容,返回文本内容。


    -5 Scrapy框架:
    高定制性高性能的Python爬虫框架:
    函数 - 类 - 模块/库/包 - 框架:包含了很多不同功能的模块
    提供了数据下载、数据提取、数据存储、请求去重等,并且使用了twisted异步网络框架,下载速度非常快。

    -6 scraoy-redis 分布式策略:
    scrapy本身不支持分布式,scrapy-redis就是一套以redis数据库为核心的组件,让Scrapy具有了支持分布式的功能。所有的请求、请求去重指纹、数据都存储在同一个Redis数据库里,可以统一调度和分配。


    -7 爬虫- 反爬虫 - 反反爬虫:

    User-Agent、代理IP、验证码、动态数据加载等...


    权衡:

    数据成本 比较 人力成本 + 机器成本

    爬虫和反爬虫之间的斗争,一定是爬虫获胜!
    只要是真实用户可以浏览的网页数据,都可以用爬虫爬取下来。

    毛主席说过:战略上蔑视、战术上重视。

    Python自带的模块位置:
    /usr/lib/python2.7/urllib2.py

    通过pip install 安装的模块位置
    /usr/local/lib/python2.7/site-packages

    Ubuntu虚拟环境
    workon spider_py2

      

    gbk -> utf-8

    str_utf8 = str_gbk.decode("utf-8").encode("gbk")

    任何平台的任何编码格式都可以和Unicode互相转换。

      

    从计算机硬件角度:


    计算机核心是CPU,承担了所有的运算任务。

    单核CPU一次只能运行一个任务。AMD 物理核心
    多核CPU一次能够运行多个任务。INTEL 虚拟核心


    台式机I5 四核四线程
    四个CPU核心,四个逻辑处理器,每个CPU核心都能运行一个任务
    能够同时运行四个任务。

    笔记本I5 双核四线程
    二个CPU核心,四个逻辑处理器,每个CPU核心都能运行一个任务
    能够同时运行四个任务。


    CPU的线程 和 操作系统调度的线程 不是一个概念。


    从操作系统角度:

    进程:一个进程表示一个程序的执行活动;
    线程:进行CPU运算最小调度单位。


    进程之间是互相独立的,一个CPU同时只能运行一个进程(单核),其他进程就处于非运行状态。
    进程可以包含的一个或多个的执行单元,叫线程。


    举例:运行了一个爬虫程序,就会执行一个进程。CPU会有很多时间切片,给每个执行的线程分配一个时间切片,一个时间切片内只能执行一个任务。


    同一个进程之间的内存空间是共享,不同进程之间的内存空间不共享。

    一个线程在使用进程的内存空间时,其他线程必须等待结束,才能使用这块内存空间。

    "互斥锁" 防止多个线程同时访问一块内存空间。


    多线程:表示一个程序可以同时并发执行多个任务。

    Python的多线程:
    GIL(全局解释器锁):比如某个线程想要执行任务,必须获取GIL,在Python一个进程里,只有一个GIL。
    线程必须拥有GIL才能执行任务,没有GIL的线程就不允许执行任务。

    Python的多线程并不是真正的多线程,不能充分利用CPU的资源。


    多进程:密集CPU运算(大量的并行运算),可以使用multiprocessing。
    缺陷:多个进程之间的通信成本很高,对于需要进行大量数据通信的任务,就不适合多进程。

    多线程:密集I/O处理(网络I/O,文件读写I/O),threading.Thread,multiprocessing.dummy、
    缺陷:同一个CPU时间切片只能运行一个线程,优势:线程和线程之间的通信非常方便。

    协程:处理了进程和线程之间切换和创建的开销,协程爬虫。genvent


    for //div[@class='info']
    //span[@class='title']/text()
    //span[@class='rating_num']/text()

    所有页码
    //div[@class='paginator']/a/@href


    https://movie.douban.com/top250

    爬取优先级:
    PC > 移动端 > HTML5 > APP


    //input[@name='form_email']

    form_password


    soup = BeautifulSou(driver.page_source, "lxml")

    爬虫的八字真言:模拟请求,处理响应。

      

    scrapy各组件工作:

    spider : 接收响应,经过提取后返回:1. 继续发送的请求->调度器 2. 需要存储的数据-> 管道

    调度器:将请求排序、去重、入队列、出队列。

    下载器:发送请求,返回响应给spider

    管道:接收需要存储的数据,处理这些数据(存数据库、存json、存csv....)

    下载中间件:请求发送前添加代理、切换user-agent等处理...


    http://www.itcast.cn/channel/teacher.shtml

    //div[@class='li_txt']

    h3
    h4
    p

    更换IP方式:

    Ip :电脑Ip(代理池)

    Tor :暗网,访问慢,动态Ip

    ADSL :拨号上网,动态Ip(断开重新连接,会更换IP)


    常用的命令:

    # 创建一个Scrapy项目,名为XXX
    scrapy startproject XXX

    # 创建一个Scrapy.Spider类的爬虫,爬虫名为xxx,所属网站域名为xxx.com
    scrapy genspider xxx "xxx.com"

    # 执行爬虫xxx,表示启动爬虫
    scrapy crawl xxx

    # 执行爬虫,并按json格式存储结果,默认Unicode编码
    scrapy crawl itcast -o itcast.json

    # 执行爬虫,并按csv格式存储结果
    scrapy crawl itcast -o itcast.csv


    scrapy.Spider类爬虫必备的参数:

    # 导入scrapy
    import scrapy

    class ItcastSpider(scrapy.Spider):
    # 当前爬虫文件的爬虫名,对应执行爬虫的爬虫名称
    name = "xxx"

    # 允许当前爬虫爬取的网站域名范围,不在域名列表内的网页将不爬取
    allowed_domains = ['xxx.com', 'xxxx.com']

    #启动爬虫后,开始爬取的第一批url地址将从start_urls里获取
    start_urls = ['http://www.xxx.com/xxxxxx.html']

    # scrapy.Spider类的爬虫,返回的响应对象默认由parse()函数处理
    def parse(self, response):
    print response.body


    scrapy项目使用流程:

    1. 创建项目: scrapy startproject

    2. 编写item : item.py 定义存储数据的字段

    3. 编写spider: spiders/spider.py 用来发送start_urls请求,并 parse() 处理响应提取数据, yield item(交给管道) yield Request(交给调度器去下载)

    4. 编写pipelines:pipelines.py 处理通过spider返回的item数据

    5. 启用管道: settings.py ITEM_PIPELINES 启用自定义的管道

    6. 编写middlewares(如果有的话): middlewares 处理发送前的请求(添加代理)


    启动MongoDB服务: 储存数据:字典格式
    sudo mongod

    启动MongoDB Shell
    sudo mongo


    1. 查看当前所有数据库
    show dbs

    2. 切换指定数据库
    use Douban

    3. 查看当前数据库下所有的表
    show collections
    > DoubanMovie

    4. 查看当前数据库下指定表的数据
    db.DoubanMovie.find()


    MongoDB
    Redis
    MySQL

    pip -V
    sudo pip install pip --upgrade

    sudo pip install scrapy --upgrade

    Scrapyd 的远程部署和监控

    1. 安装Scrapyd
    sudo pip install scrapyd # 安装scrapyd服务
    sudo pip install scrapyd-client # 安装scrapyd客户端


    2. 启动scrapyd服务
    scrapyd # 启动服务,端口号 6800

    远程连接: 打开浏览器,192.168.105.99:6800

    3. 部署scrapy项目到scrapyd上的配置

    # 1. scrapyd的配置名
    [deploy:scrapy_Tencent]

    # 2. 启动scrapyd服务的远程主机ip,localhost默认本机的
    url = http://localhost:6800/
    #url = http:192.168.xx.xxx:6800

    #- 3.项目名称
    project = Tencent

    4. 将scrapy项目部署到scrapyd上

    # -p 执行项目名,将Tencent按指定的配置信息部署到scrapyd
    scrapyd-deploy scrapy_Tencent -p Tencent


    5. 启动项目下指定的爬虫
    curl http://localhost:6800/schedule.json -d project=Tencent -d spider=tencent

    {"status": "ok", "jobid": "2f240b1171bc11e7ae5aa45e60e36247", "node_name": "PowerMac.local"}

    6. 停止项目下指定的爬虫

    curl http://localhost:6800/cancel.json -d project=Tencent -d job=2f240b1171bc11e7ae5aa45e60e36247


    7. 停止scrapyd的服务
    Control + C

  • 相关阅读:
    v-if和v-show的区别
    关于C语言静态链接的个人理解,欢迎指正
    关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正
    Android: ScrollView监听滑动到顶端和底端
    Android小记之--ClickableSpan
    Android小记之--android:listSelector
    表达式参数
    Http和Socket连接
    Hibernate: merge方法
    Android小代码——设置全屏
  • 原文地址:https://www.cnblogs.com/qq_841161825/p/8447560.html
Copyright © 2011-2022 走看看