• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Python爬虫 Scrapy七

武飞扬头像
冲a铁子
帮助1

简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

安装

pip install scrapy

遇到问题目前主要是网络问题,多试几次就好。最后解决方案使用使用anaconda

使用

创建项目

scrapy startproject [项目名称]

目录结构

  • spiders(数据解析器)
    init.py
    自定义的爬虫文件.py ‐‐‐> 由我们自己创建,是实现爬虫核心功能的文件

  • items.py ‐‐‐>定义数据结构的地方,是一个继承自scrapy.Item的类

  • middlewares.py ‐‐‐> 中间件 代理

  • pipelines.py ‐‐‐>管道文件,里面只有一个类,用于处理下载数据的后续处理
    默认是300优先级,值越小优先级越高(1‐1000)

  • settings.py ‐‐‐> 配置文件 比如:是否遵守robots协议,User‐Agent定义等

  • init.py

重要命令、方法

创建项目

scrapy startproject [项目名称]

创建爬虫文件

spiders目录下执行

scrapy genspider [爬虫名字] [网页的域名不带http]

<!--另一种模板-->
scrapy genspider ‐t crawl read www.dushu.com

可以查看scrapy爬虫的模板类型,这里使用默认的

执行爬虫

scrapy crawl [爬虫名称]
<!--注意:应在spiders文件夹内执行-->

response方法

response.text ‐‐‐》响应的是字符串
response.body ‐‐‐》响应的是二进制文件
response.xpath()‐》xpath方法的返回值类型是selector列表
response.status -> http状态
response.extract() ‐‐‐》提取的是selector对象的是data
response.extract_first() ‐‐‐》提取的是selector列表中的第一个数据

还有方法自己百度学习吧

yield

  1. 带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代
  2. yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代
    时,从上一次迭代遇到的yield后面的代码(下一行)开始执行
  3. 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

参考下面示例,返回。注意看层级嵌套的处理

示例

创建:
spiders目录下执行
scrapy genspider [爬虫名字] [网页的域名不带http]

自定义dangdang.py解析器

import scrapy

from scrapyproject.items import ScrapyprojectItem


class TcSpider(scrapy.Spider):
    # 爬虫名称
    name = 'dangdang'
    # 可执行域名
    allowed_domains = ['category.dangdang.com']
    # 起始地址
    start_urls = ['http://category.dangdang.com/cp01.21.04.03.00.00.html']
    # 自定义的变量
    base_url = 'http://category.dangdang.com/'
    page = 1

    def parse(self, response):
        # response.text ‐‐‐》响应的是字符串
        # response.body ‐‐‐》响应的是二进制文件
        # response.xpath()‐》xpath方法的返回值类型是selector列表
        # extract() ‐‐‐》提取的是selector对象的是data
        # extract_first() ‐‐‐》提取的是selector列表中的第一个数据
        # name_xpath = '//*[@id="component_59"]/li/a/@title'
        # names = response.xpath(name_xpath)
        # src_xpath = '//*[@id="component_59"]/li/a/img/@src'
        # images = response.xpath(src_xpath)
        # price_xpath = '//*[@id="component_59"]/li/p[@class="price"]/span[@class="search_now_price"]/text()'
        # prices = (response.xpath(price_xpath))
        # for index in range(len(names)):
        #     print("书名:", names[index].extract())
        #     print("图片:", images[index].extract())
        #     print("价格:", prices[index].extract())
        # 相比以上写法,可得selector可以重复使用xpath方法
        li_xpath = response.xpath('//*[@id="component_59"]/li')
        for index in li_xpath:
            name = index.xpath('.//a/@title').extract_first()
            # print("书名:", name)
            # print("图片:", index.xpath('.//a/img/@src').extract())
            # 这里有反扒机制,图片懒加载
            if index.xpath('.//a/img/@data-original').extract_first() is None:
                image = index.xpath('.//a/img/@src').extract_first()
            else:
                image = index.xpath('.//a/img/@data-original').extract_first()
            # print("图片:", image)
            price = index.xpath('.//p[@class="price"]/span[@class="search_now_price"]/text()').extract_first()
            # print("价格:", price)
            item = ScrapyprojectItem(name=name, src=image, price=price)
            yield item

        # 手动调用请求
        if self.page < 3:
            c_url = self.base_url   'pg'   str(self.page)   '-cp01.21.04.03.00.00.html'
            yield scrapy.Request(url=c_url, callback=self.parse)

学新通

管道pipelines

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


# 管道处理数据,在setting开启管道
# 读书网管道
class ScrapyprojectReadPipeline:
    # 爬虫开始之前执行
    def open_spider(self, spider):
        # 定义一个变量存储数据
        self.move = []

    # 爬虫开始之后执行
    def close_spider(self, spider):
        print("一共条数据:",len(self.move))
        # 关闭之前处理数据
        with open('book.js', 'a', encoding='utf-8') as fp:
            fp.write(str(self.move))

    # 每个数据处理
    def process_item(self, item, spider):
        # 这个位置写入必须强转str
        # 注意追加写入
        # io消耗大,做批量处理最好
        # with open('book.js', 'a', encoding='utf-8') as fp:
        #     fp.write(str(item))
        self.move.append(item)
        return item
学新通

配置settings

主要配置

# Obey robots.txt rules  爬虫规则遵守
ROBOTSTXT_OBEY = False

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# 开启管道
ITEM_PIPELINES = {
    # 管道值越小优先级越高
    # 'scrapyproject.pipelines.ScrapyprojectPipeline': 300,
    # 自定义管道
    # 'scrapyproject.pipelines.ScrapyprojectDangdangPipeline': 300,
    # 电影天堂管道
    # 'scrapyproject.pipelines.ScrapyprojectDYTTPipeline': 300,
    # 读书网管道
    'scrapyproject.pipelines.ScrapyprojectReadPipeline': 300,
}
学新通

scrapy shell

  1. 什么是scrapy shell?
    Scrapy终端,是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。 在编写您的spider时,该终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。
    一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。

  2. 安装ipython
    安装:pip install ipython
    简介:如果您安装了 IPython,Scrapy终端将使用 IPython(替代标准Python终端)。 IPython终端与其他相
    比更为强大,提供智能的自动补全,高亮输,及其他特性。

  3. 应用:
    (1)scrapy shell www.百度.com
    (2)scrapy shell http://www.百度.co

了解即可,目前我不用

自定义请求

参考示例,主要是针对方法的重写

class ReadBookSpider(CrawlSpider):

    # 注意版本,喝视频方法不一致
    def _parse(self, response):
        print('                                                                              ')
        li_xpath = response.xpath('//div[@class="bookslist"]/ul/li')
        for index in li_xpath:
            name = index.xpath('.//h3/a/text()').extract_first()
            src = index.xpath('.//h3/a/@href').extract_first()
            item = ScrapyprojectItem(name=name, src=src)
            yield item

    # 请求之前,在这里可以处理参数等问题
    def start_requests(self):
        # post请求,处理里面参数
        yield scrapy.FormRequest(url='', formdata={}, callback=self._parse)
        # get请求
        yield scrapy.Request(url='', callback=self._parse)


学新通

注意setting里面还很多全局设置需要查看资料

setting设置

获取setting文件参数

from scrapy.utils.project import get_project_settings

params = settings['params']
(1)日志级别:
CRITICAL:严重错误
ERROR: 一般错误
WARNING: 警告
INFO: 一般信息
DEBUG: 调试信息
默认的日志等级是DEBUG
只要出现了DEBUG或者DEBUG以上等级的日志那么这些日志将会打印

(2)settings.py文件设置:
默认的级别为DEBUG,会显示上面所有的信息10.scrapy的post请求

代理
在配置文件中 settings.py
LOG_FILE : 将屏幕显示的信息全部记录到文件中,屏幕不再显示,注意文件后缀一定是.log
LOG_LEVEL : 设置日志显示的等级,就是显示哪些,不显示哪些
学新通

该框架只是学了皮毛,还需要多练习 查文档,在自己使用中基本Selenium就足够

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfihhjf
系列文章
更多 icon
同类精品
更多 icon
继续加载