zoukankan      html  css  js  c++  java
  • Python学习笔记(七)

    Python爬虫框架

    • 安装Scrapy框架

      1、命令行
      conda install scrapy
      
      2、PYcharm
      setting -> project interpreter ->  + 号,搜索scrapy ,install
      

    爬虫工作基本原理——数据采集

    大数据数据采集有两种:

    1、从网上爬取 crawling

    2、从本地收集 scraping

    流程步骤:

    1、模拟浏览器发送请求 : urllib,request,scrapy(框架)

    2、获取浏览器的相应

    3、解析响应内容 : lxml ,beautifulsoup

    4、存储所需数据 : CSV,JSON,RDBMS(pymysql),Mongodb

    =========================================================================

    1、Request 的API

    =========================================================================

    1、发送请求

    import  requests as req
    #发送请求,获取响应
    reply=req.get("https://beijing.8684.cn/x_35b1e697")
    

    2、获取响应

    print(reply.content)  #二进制的HTML ,用于xpath解析
    print(reply.text)     #字符HTML,用于正则解析
    print(reply.status_code) #响应的状态码
    

    ============================================================================

    2、lxml 的API

    ============================================================================

    1.导包

    from lxml import etree as et
    

    2.解析HTML(二进制文件)

    root=et.HTML(reply.content)
    
    #XPATH语法
    root.Xpath('//book').tag
    

    3.demo

    #request获取 + lxml解析
    
    import  requests as req
    from lxml import etree as et
    #发送请求,获取响应
    reply=req.get("https://beijing.8684.cn/x_35b1e697")
    #print(reply.content)
    src=reply.content
    root=et.HTML(src)
    #非包装类,直接返回一个字符串型的列表list
    print(root.xpath("//div[@class='bus_site_layer']/div/a/text()"))
    
    

    Xpath语法

    表达式描述
    nodename 选取的节点名
    / 从根节点选取
    // 选取所有符合条件的节点,而不考虑它们的位置
    . 选取当前节点
    .. 选取当前节点的父节点
    @ 选取属性
    [@attrib] 选取所有包含指定属性的节点
    [@attrib='value'] 选取所有指定属性值为value的节点,也可以是其他逻辑运算符
    [tag] 所有子节点包含指定节点名的节点
    [position] 通过索引选取节点
    /方法名() 调用结点方法获取返回值list,不可直接在position后使用
    * 匹配任何元素节点。
    @* 匹配任何属性节点。
    node() 匹配任何类型的节点。
    exp1|exp2 或,多条件选取

    ==========================================================================

    3、 Scrapy 框架

    =========================================================================

    官方指定测试网址:http://quotes.toscrape.com/

    创建一个爬虫工程

    1、创建一个目录,cmd中cd到该目录,然后创建工程scrapy startproject $youprojectname

    2、创建一个Spider爬虫文件,scrapy genspider $youspidername $start_url

    start_url 不能加https

    默认的parse()方法是空

    工程目录下的spider文件下生成$youspidername.py文件

    导入到Pycharm 进行业务逻辑编写

    3、启动爬虫spider :

    cmd启动: scrapy crawl $youspidername

    在py脚本中启动:

    from scrapy.cmdline import execute
    execute('scrapy crawl $youspidername'.split())
    

    框架组成

    • spiders文件夹

      • 定义爬虫文件
    • items.py

      • 定义框架内数据传输格式
    • pipelines.py

      • 数据保存模块
    • middlewares.py

      • 中间件模块,代理服务
    • settings.py

      • 框架配置模块

    1565750916521

    spider--> Scheduler --> downloader(middlewares) ->> spiders ->> itemPipeline

    通过解析方法返回爬取页面数据

    • parse()方法的response参数
    • response对象常用属性和方法
    • 返回都是Selector选择器类
    属性或方法作用
    url 当前返回数据所对应的页面url
    status http请求状态码
    meta 用于request与response之间的数据传递
    body 返回页面html源码,如用纯正则表达式匹配数据需要获得页面html源码
    xpath() 使用xpath选择器解析网页
    css() 使用css选择器解析网页

    关于选择器

    有三种:

    • xpath选择器 基于lxml库,用于选择XML文档中的节点的语言,可以与HTML一起使用
    • css选择器 用于将样式应用于HTML文档的语言 将样式与特定的HTML元素相关联
    • 正则表达式 提取非标签内容

    关于提取器

    获取选择器中的网页数据data

    extract() 提取selector列表中的网页数据 如果列表为空,取下标为0的网页数据会抛出异常 extract_first() 提取selector列表中下标为0的网页数据 如果列表为空,不会抛出异常,返回none

    业务模块spiders.demo
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.cmdline import execute
    
    
    class FirstscSpider(scrapy.Spider):
        name = 'firstsc'
        allowed_domains = ['www.kgc.cn']
        start_urls = ['http://www.kgc.cn/']
    
        def parse(self, response):
            print('---------------------')
            res=response.xpath('//p[@class="orientation"]/text()')
            for item in res:
                print(item)
            print('---------------------')
    
    
    execute('scrapy crawl firstsc'.split())  #py脚本执行scrapy
    

    关于反爬虫(User_Agent 和 Cookies)

    设置用户代理模拟浏览器,步骤:

    1、使用浏览器打开一个网页,进入控制台--->Network --> Header -->拷贝最底部USER_Agent的值

    2、scrapy工程中找到setting.py ,查找USER_AGENT 属性,去掉注释,粘贴赋值

    设置COOKIE保持登录状态

    1、自己使用浏览器登陆网页,然后进入要爬取的域名,进入F12控制台-->network->Doc -->域名同名文件

    2、在文件中找到RequestHeader ,复制

    3、在scrapt框架的settings.py文件中找到DEFAULT_REQUEST_HEADERS属性,将复制的内容以json格式赋值给它

    4、关于settings中的Cookies的设置规则

    • 当COOKIES_ENABLED是注释的时候scrapy默认没有开启cookie
    • 当COOKIES_ENABLED没有注释设置为False的时候scrapy默认使用了settings里面的cookie
    • 当COOKIES_ENABLED设置为True的时候scrapy就会把settings的cookie关掉,使用自定义cookie

    Tips:这样做有一个缺点是,默认所有Request都会使用该Cookies。能不能

    关于翻页爬取的管理

    在parse方法中使用yield方法,根据获取的url生成Request类,并指定这个Request的回调方法

    关于详情页的获取

    即子页面的获取

    核心功能: 生成器、回调函数、meta

    生成器:通过yied语法生成多个Request,调用Schedular获取页面的响应,

    回调函数:指定该Request的回调函数,即处理这个Request的方法

    meta:指定Request与Response的映射字典,使回调函数的Response能够获得对应Request对象

    关于数据保存

    1、在item模块中定义数据结构的字段,在spider中进行赋值

    #item的定义方式
    name = scrapy.Field()
    age = scrapy.Field()
    
    #赋值方式
    obj=$youspidername+Item()
    obj['name']="huyang"
    

    2、在pipeline模块中过滤处理并将数据存储到仓库

    命令行模式:-o filename

    IDE模式:在爬虫模块的回调方法中使用生成器yield返回一个item类的实例对象,在settings.py中设置FEED_FORMAT='CSV' FEED_URI='d:/python.csv'

    保存到CSV

    保存到MySQL

    1、重写pipelins.py

    import pymysql
    
    
    class ScrapydemoPipeline(object):
        # 定义构造器,初始化要写入的文件
        def __init__(self):
            self.db = pymysql.connect(host="192.168.137.137", user="root", passwd="rw", db="scrapy", port=3306,
                                      charset='utf8')
            self.cur = self.db.cursor()
    
        # 重写close_spider回调方法,用于关闭数据库资源
        def close_spider(self, spider):
            print('----------关闭数据库资源-----------')
            # 关闭游标
            self.cur.close()
            # 关闭连接
            self.db.close()
    
        def process_item(self, item, spider):
            #SQL语句
            sql = """
            insert into bus_line_site(`name`,`dicts`,`sites`) values(%s,%s,%s)
            """
            self.cur.execute(sql, (item['name'], item['dicts'], item['sites']))
            self.db.commit()
    
    

    2、setting.py中关于ITEM_PIPELINE属性去掉注释,然后添加FEED_EXPORT_ENCODING = 'utf-8'

    3、设置MYSQL表和数据的字符集为utf8

    4、回调函数中要使用yield返回一个item类的实例

    动态页面爬取???

  • 相关阅读:
    Windows dll注入
    Android获取ROOT权限的通用方法
    Android odex,oat文件的反编译,回编译
    盘点那些适配Linux的国产常用软件
    Hook Java API以获得MD5加密前数据
    修改Android源码实现原生应用双开,应用多开
    让终端更好看--Ubuntu OhMyZsh配置指南
    (二) go语言设计模式-创建模式之抽象工厂模式(Abstract Factory)
    (一) go语言设计模式概述
    j2ee高级开发技术课程第十四周
  • 原文地址:https://www.cnblogs.com/whoyoung/p/11424204.html
Copyright © 2011-2022 走看看