使用scrapy抓取目标url下所有的课程名和价格,并将数据保存为json格式url=http://www.tanzhouedu.com/mall/course/initAllCourse

观察网页并分析该网页:

是一个ajax加载的页面,每次数据变化,但是url不变化,
通过查看headers中的信息,得到每次点击下一页时真正请求的链接url
观察发现每次翻页,请求变化的是offset的数值和时间戳

1.创建项目

使用命令:scrapy startproject 'project_name'得到对象的项目文件夹,里面包含scrapy的一些必要组件

如下:

具体文件含义,参见链接:http://www.cnblogs.com/pythoner6833/p/9012292.html

2.明确抓取目标。

编辑items.py文件,定义好需要抓取的数据字段名

代码如下:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class TanzhouItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
"""
定义爬取的目标,本案例中只爬取标题和价格两个内容
所以定义两个字段
"""
# 课程金额
money = scrapy.Field()
# 课程名称
title = scrapy.Field()

3.编辑爬虫。

进入spiders文件夹下,创建爬虫文件,命令:scrapy  genspider  'spider_name'  "start_url"

就会得到一个以spider_name命名的文件,在里面编写爬虫的逻辑

# -*- coding: utf-8 -*-
"""
抓取:http://www.tanzhouedu.com/mall/course/initAllCourse
下的所有课程名称和价格,并保存为json格式 网页分析:
是一个ajax加载的页面,每次数据变化,但是url不变化,
通过查看headers中的信息,得到每次点击下一页时真正请求的链接url
观察发现每次翻页,请求变化的是offset的数值和时间戳 1.首先创建一个爬虫项目。
使用命令:scrapy startproject 'pro_name' # pro_name是项目名称
输入命令后,会自动出现一个用pro_name的项目文件夹,
里面包含一个scrapy项目所必要的文件 2.明确爬取目标,编辑items.py文件,定义需要爬取的字段。 3.编辑爬虫。进入spiders文件夹下,创建爬虫文件。
使用命令:scrapy genspider 'spider_name' 'start_url'
生成一个爬虫,名字为spider_name,初始爬取url为start_url
会在spiders文件夹下生成一个spider_name.py的文件,
里面包含一个name=‘spider_name’, name是不同爬虫的唯一标识,不能重复
start_url是爬虫的第一个爬取链接(可修改),并返回一个response
解析response中的其他可用链接和数据 4.将爬取到的数据通过yield,丢给pipelines.py文件保存,
在pipelines.py文件中编写保存文件的逻辑 5.运行爬虫,使用命令:scrapy crawl "spider_name" 注:在配置文件中打开头信息和管道
""" import scrapy # 从items文件中导入已经写好的待爬取目标(money和title)
from tanzhou.items import TanzhouItem
import time class TzSpider(scrapy.Spider):
name = 'tz' # 爬虫名称。区别于其他爬虫的唯一ID。
allowed_domains = ['tanzhouedu.com'] # 允许域名 # 爬虫的第一个爬取链接,启动爬虫就执行,并返回一个response交给parse函数
start_urls = ['http://www.tanzhouedu.com/mall/course/initAllCourse']
offset = 0 def parse(self, response):
item = TanzhouItem() # 实例化。实例一个爬取字段的实例对象。 # 通过xpath解析response,并从中提取数据,得到xpath对象
node_list = response.xpath('//div[@id="newCourse"]/div/div/ul/li')
for node in node_list:
# extract_first() 是取对象的值,得到一个字符串
item['money'] = node.xpath('./div/span/text()').extract_first()
item['title'] = node.xpath('./a/@title').extract_first() yield item
# yield将item返回,scrapy_engine通过管道,将item交给pipelines
# pipelines.py文件用于爬取结果的保存 if node_list == []:
"""
下一页到最后时,xpath匹配到的是一个空列表
此时已没有可爬取页面,return结束程序。
"""
return self.offset += 20 # 构造变化的offset,每次翻页增加20 # yield将新的请求丢给调度器,然后交给下载器,继续下载页面,得到response
# callback回调parse函数,实现循环抓取
yield scrapy.Request(url="http://www.tanzhouedu.com/mall/course/initAllCourse?params.offset="
+ str(self.offset) +"&params.num=20&keyword=&_=" + str(int(time.time() * 1000)), callback=self.parse)

4.编写保存数据的逻辑。

在pipelines.py文件中编写保存数据的逻辑

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import json class TanzhouPipeline(object):
"""
编写爬取到的数据保存的逻辑
"""
def __init__(self):
"""
可选择实现,对参数做一些初始化的处理
"""
pass def open_spider(self, spider):
"""
重写open_spider函数,该函数在爬虫启动时就自动执行
:param spider:
:return:
"""
self.file = open("tz.json", 'w', encoding='utf-8') def process_item(self, item, spider):
"""
将yield丢过来的数据进行一定的处理并保存
:param item:
:param spider:
:return:
"""
# 管道传过来的数据item是一个对象,将它转化为字典,然后存储
content = json.dumps(dict(item), ensure_ascii=False) + '\n'
self.file.write(content)
return item def close_spider(self, spider):
"""
重写该函数,爬虫执行完毕后执行该函数
:param spider:
:return:
"""
self.file.close()

5.运行爬虫。

使用命令:scrapy crawl  "spider_name"

运行结果:

得到一个保存有抓取结果的json文件

完整代码

参见:https://github.com/zInPython/tanzhou

scrapy的一个简单小项目的更多相关文章

  1. Extjs6(一)——用sencha cmd建立一个ExtJs小项目

    本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...

  2. 用IntelliJ IDEA学习Spring--创建一个简单的项目

    这段时间想学习一下Spring,其实之前学过Spring,只是有些忘记了.而且之前学的时候是适用eclipse学习的,现在好像对IntelliJ这个工具使用挺多的,现在就学习一下这个工具的用法,顺便复 ...

  3. 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包

    参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...

  4. 创建第一个spirngmvc小项目

    题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...

  5. 又见angular----步一步做一个angular4小项目

    这两天看了看angular4的文档,发现他和angular1.X的差别真的是太大了,官方给出的那个管理英雄的Demo是一个非常好的入门项目,这里给出一个管理个人计划的小项目,从头至尾一步一步讲解如何去 ...

  6. 关于Hibernate的一个简单小程序

    本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...

  7. vue-cli安装以及创建一个简单的项目(二)(vuex使用、发行一个简单的app)

    1.vuex的使用 vuex是vue的状态管理中心,vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,常用于: 1.多个视图依赖同一状态(l例:菜单导航) 2.来自不同 ...

  8. Scrapy框架简介及小项目应用

    今天来总结一下Scrapy框架的用法.scrapy的架构如下: Engine  :引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Items :项目,它定义了爬取结果的数据结构,爬取的数 ...

  9. 软件----- idea 配置创建一个简单javase项目

    1.显示工具栏和工具按钮,勾选上 如图,在左侧会增加对应的 2.设置项目结构,选择jdk 点击new  选择需要jdk 3.创建一个简单的java文件,和eclipse与myeslipse 差不多, ...

随机推荐

  1. MUI错误信息:系统已经存在较高版本,些安装包无法安装。

    MUI 混合开发APP 版本更新问题. 错误信息: 解决方法: manifest.json->version->code 这个值需要累加,version->name 是用于显示的,这 ...

  2. 七牛云图片存储---Java

    一.新建存储空间 到七牛云官网注册一个账号 新建一个存储空间 到个人中心获取秘钥 二.新建Java项目 1.pom.xml配置 <dependency> <groupId>co ...

  3. Kali Linux——迈向网络攻防

    自从进入大三的课程后,在已学的高数.线代.数论.概率论.信息论.通信等知识的技术上,开始了网络信息安全.网      络攻防的学习.俗话说得好,磨刀不误砍柴工,开始网络攻防之旅也势必要一个好的工具.然 ...

  4. API gateway 之 kong 基本操作 (三)

    一.演示环境准备 1.nginx配置 [root@nginx conf.d]# pwd /etc/nginx/conf.d [root@nginx conf.d]# ls conf_bak kong_ ...

  5. 学习笔记62_python文件操作

    #使用 str = raw_input("输入密码:") 来获取键盘的输入 #创建或打开一个文件 fp = open("hellow.txt","w& ...

  6. C# - VS2019 通过DataGridView实现对Oracle数据表的增删改查

    前言 通过VS2019建立WinFrm应用程序,搭建桌面程序后,通过封装数据库操作OracleHelper类和业务逻辑操作OracleSQL类,进而通过DataGridView实现对Oracle数据表 ...

  7. javascript中判断数据类型

    编写javascript代码的时候常常要判断变量,字面量的类型,可以用typeof,instanceof,Array.isArray(),等方法,究竟哪一种最方便,最实用,最省心呢?本问探讨这个问题. ...

  8. 手写Spring框架,加深对Spring工作机制的理解!

    在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越 ...

  9. mysql cpu使用率过高解决方法

    mysql cpu使用率过高解决方法 1 mysql查看正在运行的语句 并且查看运行最多的mysql语句 MySQL 打开 general log 后,所有的查询语句都会记录在 general log ...

  10. Comparable接口的实现和使用

    1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 .实现此接口的对象列表(和数组)可 ...