python scrapy拆解查看Spider类爬取优设网极细讲解

目录
  • 拆解 scrapy.Spider
  • scrapy.Spider 属性值
  • scrapy.Spider 实例方法与类方法
  • 爬取优设网
    • Field 字段的两个参数:

拆解 scrapy.Spider

本次采集的目标站点为:优设网

每次创建一个 spider 文件之后,都会默认生成如下代码:

import scrapy
class UiSpider(scrapy.Spider):
    name = 'ui'
    allowed_domains = ['www.uisdc.com']
    start_urls = ['http://www.uisdc.com/']

    def parse(self, response):
        self.log()

继承的基类 scrapy.Spider 自然就成了我们要研究的第一个内容,进入其源码,发现如下内容。

scrapy.Spider 核心实现的是 start_requests 方法

Spider 主要进行的操作就是初始化 Request 请求,而这些都是通过 start_requests 实现的,详细代码为:

for url in self.start_urls:
    yield Request(url, dont_filter=True)

start_requests 方法,你可以自己编写同名函数覆盖修改,编写时发现了 make_requests_from_url 方法,该方法在最新版本的 scrapy 中已经被废除。

重写 start_requests 方法 ,需要注意重写时,必须返回一个可迭代对象,并且该对象包含 spider 用于爬取的第 1 个 Request,由于 scrapy 只调用一次该方法,所以你可以将登录站点请求放置到该方法中。

import scrapy
from scrapy.http import Request
class UiSpider(scrapy.Spider):
    name = 'ui'
    allowed_domains = ['www.uisdc.com']
    start_urls = ['http://www.uisdc.com/']

    def start_requests(self):
        print("重写 start_requests")
        yield Request(self.start_urls[0])

    def parse(self, response):
        print(response)

将登录信息放置到 start_requests 中,代码如下:

import scrapy
from scrapy.http import FormRequest
class UiSpider(scrapy.Spider):
    name = 'ui'
    allowed_domains = ['www.uisdc.com']
    start_urls = ['http://www.uisdc.com/']

    def start_requests(self):
        print("手动 start_requests")
        yield FormRequest("https://httpbin.org/post", formdata={"user": "ca"}, callback=self.parse)

    def parse(self, response):
        print(response.text)

scrapy.Spider 属性值

name 属性:

表示爬虫名称,spider 的名称用于 scrapy 定位爬虫,所以非常重要,一般常见的名称方式是使用网站域名(domain),命名 spider,例如 baidu.com 命名为 baidu,但是工作喜欢还是携带 .com 后缀。

allowed_domains 属性:

该属性需要配置 offsiteMiddleware 使用,当该中间件启用之后,待采集 URL 的域名如果不在 allowed_domains 列表中,会被禁止访问。
domains 内容添加,假设你的目标 URL 是 http://www.baidu.com/123.html,仅填写 baidu.com 即可。

start_urls 属性:

起始的 URL 列表,主要用于 start_request 方法进行迭代。

custom_settings 属性:
自定义配置,可以覆盖 settings.py 的配置,以字典格式赋值。

    custom_settings = {
        "ROBOTSTXT_OBEY": False # 不请求 robot.txt 文件
    }

crawler 属性:

该属性在爬虫启动后,由类方法 from_crawler() 设置。

settings 属性:

指定配置文件的实例。

logger 属性:

spider 日志输出对象,默认以 spider 名称创建,可以自定义。

self.logger.info('输出响应地址 %s', response.url)
logger.info('输出响应地址 %s', response.url)

补充一下 scrapy 日志级别

settings.py 中设置 log 级别,只需要增加一行代码:

LOG_LEVEL = 'WARNING'

设置为 WARNING 级别,会发现 scrapy 默认的各种调试信息,都不在控制台输出。

scrapy 日志级别与 logging 模块一致。

CRITICAL:严重错误;

ERROR :一般错误;

WARNING: 警告信息;

INFO :一般信息;

DEBUG:调试信息。

scrapy 中的 settings 中关于日志的配置如下:

LOG_ENABLED:默认: True,表示启用 logging;

LOG_ENCODING: 默认: utf-8,logging 使用的编码;

LOG_FILE 默认: None,日志保存的文件名;

LOG_LEVEL: 默认 DEBUG ,log 的最低级别。

scrapy.Spider 实例方法与类方法

from_crawler 类方法
在查看源码之后,该方法的功能会比较清晰。

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    spider = cls(*args, **kwargs)
    spider._set_crawler(crawler)
    return spider

def _set_crawler(self, crawler):
    self.crawler = crawler
    self.settings = crawler.settings
    crawler.signals.connect(self.close, signals.spider_closed)

该方法设置了 crawlersettings 两个属性,该方法在上一篇博客已经有所涉及,直接回顾即可。

parse 方法
当请求(Request)没有指定回调参数(callback)时,该方法是 scrapy 用来处理响应的默认回调方法。

log 方法
使用 self.log() 方法记录日志。

学习到这里,对 Spider 模块有了一个比较整体的认识。

爬取优设网

接下来进入爬虫采集相关代码编写,有了前文知识铺垫之后,采集代码就变得非常简单了。

import scrapy
from uisdc.items import UisdcItem
class UiSpider(scrapy.Spider):
    name = 'ui'
    allowed_domains = ['www.uisdc.com']
    start_urls = ['https://www.uisdc.com/archives']
    custom_settings = {
        "ROBOTSTXT_OBEY": False
    }

    def parse(self, response):
        # print(response.text)
        # self.log("测试是否有数据输出", logging.WARNING)
        items = response.xpath('//div[@id="archive_list"]/div/div[1]/div[1]/div[contains(@class,"item-article")]')
        for i in items:
            item = UisdcItem()
            title = i.xpath(".//h2[@class='item-title']/a/text()").extract_first()
            author = i.xpath(".//h3[@class='meta-name']/text()").extract_first()
            tag = i.xpath(".//div[@class='meta-tag']/a/text()").extract_first()
            item["title"] = title
            item["author"] = author
            item["tag"] = tag
            yield item

接下来修改源码,增加 ** Item Loaders** 填充容器机制。通过 from scrapy.loader import ItemLoader 导入新类,该类的构造函数如下:

def __init__(self, item=None, selector=None, response=None, parent=None, **context)

其中 item 是容器类,selector 为 Selector 对象,提取填充数据的选择器,response 为 Response 响应对象。

代码修改之后得到如下代码:

import scrapy
from uisdc.items import UisdcItem
from scrapy.loader import ItemLoader
class UiSpider(scrapy.Spider):
    name = 'ui'
    allowed_domains = ['www.uisdc.com']
    start_urls = ['https://www.uisdc.com/archives']
    custom_settings = {
        "ROBOTSTXT_OBEY": False
    }
    def parse(self, response):
        items = response.xpath('//div[@id="archive_list"]/div/div[1]/div[1]/div[contains(@class,"item-article")]')
        for i in items:
            l = ItemLoader(item=UisdcItem(), selector=i)
            l.add_xpath('title', ".//h2[@class='item-title']/a/text()")
            l.add_xpath('author', ".//h3[@class='meta-name']/text()")
            l.add_xpath('tag', ".//div[@class='meta-tag']/a/text()")
            yield l.load_item()

其中需要注意 l = ItemLoader(item=UisdcItem(), selector=i) 使用 selector 参数,并赋值为迭代变量 i,如果使用 response 会得到重复数据。

最后,当所有数据被收集起来之后, 调用 ItemLoader.load_item() 方法, 返回 Item 对象。

输出 item 对象,发现每一个数据都是列表。

{'author': ['土拨鼠'],
 'tag': ['产品设计'],
 'title': ['6000+干货!资深总监的四条产品设计工作观(附私藏神器包)']}

接下来需要处理每一项的值,ItemLoader 得到的数据,在存入 item 容器前,是支持对数据进行预处理的,即输入处理器和输出处理器,修改 items.py 文件。

from scrapy.item import Item, Field
from scrapy.loader.processors import MapCompose, TakeFirst
def ext(value):
    return "新闻:" + value
class UisdcItem(Item):
    # define the fields for your item here like:
    title = Field(
        input_processor=MapCompose(ext),
        output_processor=TakeFirst()
    )
    author = Field(output_processor=TakeFirst())
    tag = Field(output_processor=TakeFirst())

Field 字段的两个参数:

输入处理器(input_processor):可以在传进来的值做一些预处理。

输出处理器(output_processor) :输出值前最后的一步处理。

其中用到了 TakeFirst(),返回第一个非空(non-null/ non-empty)值,常用于单值字段的输出处理器,无参数。

还用到了 MapCompose,能把多个函数执行的结果按顺序组合起来,产生最终的输出,通常用于输入处理器。

其余内置的处理器如下

Identity:不进行任何处理,返回原来的数据,无参数;

Join:返回用分隔符连接后的值,分隔符默认为空格;

Compose:用给定的多个函数的组合,来构造处理器,list 对象一次被传递到各个函数中,由最后一个函数返回整个处理器的输出,默认情况下遇到 None值(list 中有 None 值)的时候停止处理,可以通过传递参数 stop_on_none = False 改变这种行为;

MapCompose:输入值是被迭代的处理的,List 对象中的每一个元素被单独传入,依次执行对应函数。

关于 item loader 还有一些其它的知识点,我们后面再聊。

以上就是python scrapy拆解查看Spider类爬取优设网极细讲解的详细内容,更多关于scrapy拆解Spider类爬取优设网的资料请关注我们其它相关文章!

(0)

相关推荐

  • 安装mysql noinstall zip版

    版本号: 5.5.19-winx64 1.将my-small.ini 改为my.ini (请按照自己的机器配置更改) 2.在命令行输入: \bin\mysqld –-console<BR> 回车后应该看到下面表示启动成功: mysqld: ready for connections Version: '5.5.19-log' socket: '' port: 3306 接下来可以注册为win 服务 1.确认mysql 服务终止: bin\mysqladmin -u root shutdown

  • python实战scrapy操作cookie爬取博客涉及browsercookie

    browsercookie 知识铺垫 第一个要了解的知识点是使用 browsercookie 获取浏览器 cookie ,该库使用命令 pip install browsercookie 安装即可. 接下来获取 firefox 浏览器的 cookie,不使用 chrome 谷歌浏览器的原因是在 80 版本之后,其 cookie 的加密方式进行了修改,所以使用 browsercookie 模块会出现如下错误 win32crypt must be available to decrypt Chrom

  • 讲解Python的Scrapy爬虫框架使用代理进行采集的方法

    1.在Scrapy工程下新建"middlewares.py" # Importing base64 library because we'll need it ONLY in case if the proxy we are going to use requires authentication import base64 # Start your middleware class class ProxyMiddleware(object): # overwrite process

  • python爬虫框架Scrapy基本应用学习教程

    在正式编写爬虫案例前,先对 scrapy 进行一下系统的学习. scrapy 安装与简单运行 使用命令 pip install scrapy 进行安装,成功之后,还需要随手收藏几个网址,以便于后续学习使用. scrapy 官网:https://scrapy.org scrapy 文档:https://doc.scrapy.org/en/latest/intro/tutorial.html scrapy 更新日志:https://docs.scrapy.org/en/latest/news.htm

  • python爬虫框架scrapy代理中间件掌握学习教程

    目录 代理的使用场景 使用 HttpProxyMiddleware 中间件 代理的使用场景 编写爬虫代码的程序员,永远绕不开就是使用代理,在编码过程中,你会碰到如下情形: 网络不好,需要代理: 目标站点国内访问不了,需要代理: 网站封杀了你的 IP,需要代理. 使用 HttpProxyMiddleware 中间件 本次的测试站点依旧使用 http://httpbin.org/,通过访问 http://httpbin.org/ip 可以获取当前请求的 IP 地址. HttpProxyMiddlew

  • python实战项目scrapy管道学习爬取在行高手数据

    目录 爬取目标站点分析 编码时间 爬取结果展示 爬取目标站点分析 本次采集的目标站点为:https://www.zaih.com/falcon/mentors,目标数据为在行高手数据. 本次数据保存到 MySQL 数据库中,基于目标数据,设计表结构如下所示. 对比表结构,可以直接将 scrapy 中的 items.py 文件编写完毕. class ZaihangItem(scrapy.Item): # define the fields for your item here like: name

  • python scrapy拆解查看Spider类爬取优设网极细讲解

    目录 拆解 scrapy.Spider scrapy.Spider 属性值 scrapy.Spider 实例方法与类方法 爬取优设网 Field 字段的两个参数: 拆解 scrapy.Spider 本次采集的目标站点为:优设网 每次创建一个 spider 文件之后,都会默认生成如下代码: import scrapy class UiSpider(scrapy.Spider): name = 'ui' allowed_domains = ['www.uisdc.com'] start_urls =

  • python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解

    这篇博客是自己<数据挖掘与分析>课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站.希望这篇基础文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵.真的太忙了,太长时间没有写博客了,抱歉~ 一.正则表达式 正则表达式(Regular Expression,简称Regex或RE)又称为正规表示法或常规表示法,常常用来检索.替换那些符合某个模式的文本,它首先设定好了一些特殊的字及字符组合,通过组合的&

  • Python爬虫实现的根据分类爬取豆瓣电影信息功能示例

    本文实例讲述了Python爬虫实现的根据分类爬取豆瓣电影信息功能.分享给大家供大家参考,具体如下: 代码的入口: if __name__ == '__main__': main() #! /usr/bin/python3 # -*- coding:utf-8 -*- # author:Sirius.Zhao import json from urllib.parse import quote from urllib.request import urlopen from urllib.reque

  • Python爬虫爬取煎蛋网图片代码实例

    这篇文章主要介绍了Python爬虫爬取煎蛋网图片代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天,试着爬取了煎蛋网的图片. 用到的包: urllib.request os 分别使用几个函数,来控制下载的图片的页数,获取图片的网页,获取网页页数以及保存图片到本地.过程简单清晰明了 直接上源代码: import urllib.request import os def url_open(url): req = urllib.reques

  • Python爬虫入门教程01之爬取豆瓣Top电影

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一.明确需求 爬取豆瓣Top250排行电影信息 电影名字 导演.主演 年份.国家.类型 评分.评价人数 电影简介 二.发送请求 Python中的大量开源的模块使得编码变的特别简单,我们写爬虫第一个要了解的模

  • Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单

    此货很干,跟上脚步!!! Cookie cookie是什么东西? 小饼干?能吃吗? 简单来说就是你第一次用账号密码访问服务器 服务器在你本机硬盘上设置一个身份识别的会员卡(cookie) 下次再去访问的时候只要亮一下你的卡片(cookie) 服务器就会知道是你来了,因为你的账号密码等信息已经刻在了会员卡上 需求分析 爬虫要访问一些私人的数据就需要用cookie进行伪装 想要得到cookie就得先登录,爬虫可以通过表单请求将账号密码提交上去 但是在火狐的F12截取到的数据就是, 网易云音乐先将你的

  • scrapy实践之翻页爬取的实现

    安装 Scrapy的安装很简单,官方文档也有详细的说明 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html .这里不详细说明了. 在scrapy框架中,spider具有以下几个功能 1. 定义初始爬取的url 2. 定义爬取的行为,是否跟进链接 3. 从网页中提取结构化数据 所谓的跟进链接,其实就是自动爬取该页的所有链接,然后顺着对应的链接延伸开来不断爬取,这样只需要提供一个网站首页,理论上就可以实现网站全部页面的爬取,实

  • Python爬虫实战之用selenium爬取某旅游网站

    一.selenium实战 这里我们只会用到很少的selenium语法,我这里就不补充别的用法了,以实战为目的 二.打开艺龙网 可以直接点击这里进入:艺龙网 这里是主页 三.精确目标 我们的目标是,鹤壁市,所以我们应该先点击搜索框,然后把北京删掉,替换成鹤壁市,那么怎么通过selenium实现呢? 打开pycharm,新建一个叫做艺龙网的py文件,先导包: from selenium import webdriver import time # 导包 driver = webdriver.Chro

  • Python爬虫实战之虎牙视频爬取附源码

    目录 知识点 开发环境 分析目标url 开始代码 最开始还是线导入所需模块 数据请求 获取视频标题以及url地址 获取视频id 保存数据 调用函数 运行代码,得到数据 知识点 爬虫基本流程 re正则表达式简单使用 requests json数据解析方法 视频数据保存 开发环境 Python 3.8 Pycharm 爬虫基本思路流程: (重点) [无论任何网站 任何数据内容 都是按照这个流程去分析] 1.确定需求 (爬取的内容是什么东西?) 都通过开发者工具进行抓包分析 分析视频播放url地址 是

  • 实操Python爬取觅知网素材图片示例

    目录 [一.项目背景] [二.项目目标] [三.涉及的库和网站] [四.项目分析] [五.项目实施] [六.效果展示] [七.总结] [一.项目背景]    在素材网想找到合适图片需要一页一页往下翻,现在学会python就可以用程序把所有图片保存下来,慢慢挑选合适的图片. [二.项目目标] 1.根据给定的网址获取网页源代码. 2.利用正则表达式把源代码中的图片地址过滤出来. 3.过滤出来的图片地址下载素材图片. [三.涉及的库和网站] 1.网址如下: https://www.51miz.com/

随机推荐