使用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. 用GitLab Runner自动部署GitBook并不难

    相信很多程序员喜欢用 GitBook 来写电子书.教程或者博客,看了不少文章,貌似都缺少说明如何将 GitBook 部署到版本库,并自动在服务器上 build,然后将生成的静态网站部署到云服务器上. ...

  2. python(可迭代对象,迭代器,生成器及send方法详解)

    一.可迭代对象 对象必须提供一个__iter__()方法,如果有,那么就是可迭代对象, 像列表,元祖,字典等都是可迭代对象可使用isinstance(obj,Iterable)方法判断 from co ...

  3. SpringBoot集成JWT实现权限认证

    目录 一.JWT认证流程 二.SpringBoot整合JWT 三.测试 上一篇文章<一分钟带你了解JWT认证!>介绍了JWT的组成和认证原理,本文将介绍下SpringBoot整合JWT实现 ...

  4. 在VMware15中安装虚拟机并使用Xshell连接到此虚拟机(超详细哦)

    首先点击创建新的虚拟机. 此处默认, 点击下一步 默认, 点击下一步 此处可以设置你的虚拟机名称和安装位置(强烈建议不要将安装位置放在系统盘). 此处可根据自己的电脑配置来设置(建议2,4),后续可以 ...

  5. csps63总结

    这次考试还算可以(吧),暴力都没打满,但是还差很多. T1 强烈推荐我的打法,很好理解并且很好打(虽然稍长) 维护指针指向的值及其是第几个数,然后分类讨论. (诡异构造的序列==随机数据)?? #in ...

  6. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

  7. Java传参-基本数据类型和引用数据类型作为参数的区别(值传递)

    java中的方法可以传递参数,参数的传递方法就是值传递. 参数有形参和实参,定义方法时写的参数叫形参,真正调用方法时,传递的参数叫实参. 调用方法时,会把实参传递给形参,方法内部其实是在使用形参. 所 ...

  8. 前端Leader你应该知道的NPM包管理机制

    npm install 命令 首先总结下npm 安装一个模块包的常用命令. /* 模块依赖会写入 dependencies 节点 */ npm install moduleName npm insta ...

  9. LeetCode 5264 在受污染的二叉树中查找元素 Find Elements in a Contaminated Binary Tree

    地址 https://leetcode-cn.com/contest/weekly-contest-163/problems/find-elements-in-a-contaminated-binar ...

  10. PHP---无限极分类数组处理

    $array = array(    0=>array('id'=>1,'uid'=>0,'menuname'=>'菜单1','url'=>0,'addtime'=> ...