广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python scrapy学习笔记(二)
  • 739
分享到

python scrapy学习笔记(二)

学习笔记pythonscrapy 2023-01-31 05:01:53 739人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

使用scrapy批量抓取,参考Http://python.jobbole.com/87155一、创建项目# scrapy startproject comics创建完成后的目录结构. ├── comics │   ├── __init__.

使用scrapy批量抓取,参考Http://python.jobbole.com/87155


一、创建项目

# scrapy startproject comics


创建完成后的目录结构

.
├── comics
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       └── __init__.py
└── scrapy.cfg


二、创建Spider类


start_requests:启动爬虫的时候调用,默认是调用make_requests_from_url方法爬取start_urls的链接,可以在这个方法里面定制,如果重写了该方法,start_urls默认将不会被使用,可以在这个方法里面定制一些自定义的url,如登录,从数据库读取url等,本方法返回Request对象

start_urls是框架中提供的属性,为一个包含目标网页url的数组,设置了start_urls的值后,不需要重载start_requests方法,爬虫也会依次爬取start_urls中的地址,并在请求完成后自动调用parse作为回调方法。
# cd comics/spiders
# vim comic.py

#!/usr/bin/Python
#coding:utf-8

import scrapy

class Comics(scrapy.Spider):

    name = "comics"

    def start_requests(self):
        urls = ['http://www.xeall.com/shenshi']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

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


三、开始爬取漫画

爬虫的主要任务是爬取列表中每一部漫画的图片,爬取完当前页后,进入下一页漫画列表继续爬取漫画,依次不断循环直至所有漫画爬取完毕。思路:获取当前的漫画的URl,访问后获取漫画的名字和所有的图片的URL,进行批量下载,循环往复

1、获取当前页面中漫画的url,同时获取下一个


单个漫画的url

wKioL1hsnA7AMkTFAAAlDaAq7U4318.jpg



# 找出所有的漫画url                                                                                                                                                
def parse(self, response):
# 找出所有的漫画url
def parse(self, response):

    # 请求返回的response对象
    content = Selector(response=response)

    # 获取漫画标签对象
    com_count = content.xpath("//div[@class='mainleft']/ul/li")

    # 获取单页中所有漫画的url
    comics_url_list = []
    base_url = 'http://www.xeall.com'
    for i in range(len(com_count)):
        com_url = content.xpath("//div[@class='mainleft']/ul/li[{}]/a/@href".fORMat(i+1)).extract()
        url = base_url+com_url[0]
        comics_url_list.append(url)

    # 处理当前页每部漫画
    for url in comics_url_list:
        yield scrapy.Request(url=url, callback=self.comics_parse)

    # 获取下一页的url
    url_num = content.xpath("//div[@class='mainleft']/div[@class='pages']/ul/li")
    next_url = content.xpath("//div[@class='mainleft']/div[@class='pages']/ul/li[{}]/a/@href".format(len(url_num)-3)).extract()

    # print '总页数: {},下一页: {}'.format(url_num,next_url)

    # 判断下一页是否为最后一页
    if next_url:
        next_page = 'http://www.xeall.com/shenshi/' + next_url[0]
        if next_page is not None:
            yield scrapy.Request(next_page, callback=self.parse)
            pass


2、获取所有页面


不同页面的源码

wKiom1hsnT2D-yNrAAAr1oadPro881.jpg

当前漫画的名字和url

wKiom1hsnbax886sAAA0_eZ3Pjo918.jpg

# 提取每部漫画数据
def comics_parse(self, response):                                                                                                                                  

    content = Selector(response=response)

    # 当前页数
    page_num = content.xpath("//div[@class='dede_pages']/ul/li[@class='thisclass']/a/text()").extract()

    # 首张图片的url
    current_url = content.xpath("//div[@class='mhcon_left']/ul/li/p/img/@src").extract()

    # 漫画名称
    comic_name = content.xpath("//div[@class='mhcon_left']/ul/li/p/img/@alt").extract()

    # self.log('img url: ' + current_url[0])

    # 将图片保存到本地
    self.save_img(page_num[0], comic_name[0], current_url[0])

    # 下一页图片的url,当下一页标签的href属性为‘#’时为漫画的最后一页
    page_num = content.xpath("//div[@class='dede_pages']/ul/li")
    next_page = content.xpath("//div[@class='dede_pages']/ul/li[{}]/a/@href".format(len(page_num))).extract()

    # 最后一页中href='#' 
    if next_page == '#':
        print('parse comics:' + comic_name + 'finished.')
    else:
        next_page = 'http://www.xeall.com/shenshi/' + next_page[0]
        yield scrapy.Request(next_page, callback=self.comics_parse)


3、将数据持久化存储

# 将图片编号,图片名,图片url作为参数传入
def save_img(self, img_mun, title, img_url):                                                                                                                       
    # 将图片保存到本地
    # self.log('saving pic: ' + img_url)

    # 保存漫画的文件夹
    document = os.path.join(os.getcwd(),'cartoon')

    # 每部漫画的文件名以标题命名
    comics_path = os.path.join(document,title)
    exists = os.path.exists(comics_path)

    if not exists:
        print('create document: ' + title)
        os.makedirs(comics_path)

    # 每张图片以页数命名
    pic_name = comics_path + '/' + img_mun + '.jpg'

    # 检查图片是否已经下载到本地,若存在则不再重新下载
    exists = os.path.exists(pic_name)
    if exists:
        print('pic exists: ' + pic_name)
        return

    try:
        response = requests.get(img_url,timeout=30)

        # 请求返回到的数据
        data = response

        with open(pic_name,'wb') as f:
            for chunk in data.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
                    f.flush()

        print('save p_w_picpath finished:' + pic_name)

    except Exception as e:
        print('save p_w_picpath error.')
        print(e)


完整源码地址 https://GitHub.com/yaoliang83/Scrapy-for-Comics


--结束END--

本文标题: python scrapy学习笔记(二)

本文链接: https://www.lsjlt.com/news/188730.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python scrapy学习笔记(二)
    使用scrapy批量抓取,参考http://python.jobbole.com/87155一、创建项目# scrapy startproject comics创建完成后的目录结构. ├── comics │   ├── __init__....
    99+
    2023-01-31
    学习笔记 python scrapy
  • python scrapy学习笔记
    scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型。一、安装scrapy# pip install scrapy二、基本使用1、初始化scrapy项目# scrapy startproject...
    99+
    2023-01-31
    学习笔记 python scrapy
  • Python学习笔记(二)
    学完了基础中的基础后,我们准备深入基础中的函数、类和对象。 function函数: 正如英文单词描述的,函数就是“功能”的意思,把完成一个功能所需要的代码打包起来放在一个函数下可以方便以后程序的重复调用,也能使整体代码条理清晰。正如前...
    99+
    2023-01-30
    学习笔记 Python
  • Python学习笔记(二)Python基
    [root@kaibin ~]# ipython In [1]: import platform In [2]: print platform.uname() ('Linux', 'kaibin.test1', '2.6.32-431.el...
    99+
    2023-01-31
    学习笔记 Python
  • Linux 学习笔记 二
    压缩解压缩压缩格式:gz bz2 xz zip z 压缩算法,算法不同,压缩比也不同compress: filename.Zuncompress: 不能压缩文件夹,会将文件夹内的文件单个...
    99+
    2022-10-18
  • Python第二周 学习笔记(3)
    1.运用数组实现求10万以内质数: prime = [2] for i in range(3,100000,2): flag = False up = int(i**0.5)+1 for j in prime: ...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习笔记(二):使用Pyth
    1.目的: 2.安装XlsxWriter 3.xlsxwriter常用功能: 4.在Excel中写数据: 4.1 一维表格生成 1.目的: 用xlwt来生成excel的,生成的后缀名为xls,在x...
    99+
    2023-01-31
    学习笔记 Python Pyth
  • Python学习笔记整理(二)pytho
    一、Python的数字类型 1、数字常量 python数字类型在程序中如何显示(换句话说,作为常量) 数字            常量 1234,-23,0        一般整数 9999...
    99+
    2023-01-31
    学习笔记 Python pytho
  • python学习笔记字符串(二)
    字符串类型(string)字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"123"等等。请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就...
    99+
    2023-01-31
    字符串 学习笔记 python
  • Python学习笔记—第二章—IPyth
    书目:Python(Unix和Linux系统管理指南)学习日期:20130807知识点总结:安装IPython:源码安装:tar zxvf ipython-0.13.2.tar.gz python setup.py install...
    99+
    2023-01-31
    第二章 学习笔记 Python
  • Python的Scrapy爬虫框架简单学习笔记
    一、简单配置,获取单个网页上的内容。 (1)创建scrapy项目 scrapy startproject getblog (2)编辑 items.py # -*- coding: utf-8 ...
    99+
    2022-06-04
    爬虫 学习笔记 框架
  • Python学习笔记整理(十二)Pyth
    一、函数基础 函数可以计算出一个返回值。作用:最大化代码重用,最小化代码冗余,流程的分解 1、函数相关的语句和表达式 语句        例子 Calls        myfunc(‘diege',...
    99+
    2023-01-31
    学习笔记 Python Pyth
  • mysql学习笔记二 DQL
    -- 查询编号为1004的学生的姓名和生日 select name,birthday from student where id=1004; -- 查询年龄大于18的学生信息 select...
    99+
    2018-07-25
    mysql学习笔记二 DQL
  • Python学习笔记
    Python介绍 Python是一种解释型、面向对象的语言。 官网:www.python.org Python环境 解释器:www.python.org/downloads 运行方式: 交互模式。在IDLE中运行。 脚本模式。文件的后缀...
    99+
    2023-01-30
    学习笔记 Python
  • Python 学习笔记
    rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。 print rs.query 会打印出原生sql语句 rs=Pe...
    99+
    2023-01-31
    学习笔记 Python
  • python 学习笔记第二章:安装pyt
       记得上次写python的学习笔记是三个月以前了,期间看过,也放下过,这次要坚持下来,一鼓作气,吃下python。    本文内容主要是根据《Python 简明教程》和自己的一些理解去写的,有问题,还请指出。   一、Linux 下安装...
    99+
    2023-01-31
    第二章 学习笔记 python
  • Redis学习笔记(二) 链表
    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。 redis中链表应用广泛,如list中就使用了链表。 每一个链表节点使用listNode结构标识(双向链表): typedef...
    99+
    2017-01-27
    Redis学习笔记(二) 链表
  • python学习笔记--趣学Python
    由反弹球和球拍构成的游戏。球会在屏幕上飞过来,玩家要用球拍把它弹回去 画布和画弹球 引入模块 #Tkinter -- Python的标准GUI库,Tk 接口,是python 内置的安装包 from tkinter import * i...
    99+
    2023-01-31
    学习笔记 python Python
  • python——Matplotlib学习笔记
      Matplotlib是pyhon中一个强大的绘图图,可以理解为 MatLab 开源替代,鉴于MatLab的内存之大及安装之复杂,决定先学学Matplotlib这个库。  1Matplotlib的安装  window:  打开cmd,: ...
    99+
    2023-06-02
  • python-memcached学习笔记
    介绍:   memcached是免费、开源、高性能、分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用。   数据类型:只用一种字符串类型 1:安装 sudo apt-get install me...
    99+
    2023-01-31
    学习笔记 python memcached
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作