scrapy的一个简单小项目
使用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) +"¶ms.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的一个简单小项目的更多相关文章
- Extjs6(一)——用sencha cmd建立一个ExtJs小项目
本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...
- 用IntelliJ IDEA学习Spring--创建一个简单的项目
这段时间想学习一下Spring,其实之前学过Spring,只是有些忘记了.而且之前学的时候是适用eclipse学习的,现在好像对IntelliJ这个工具使用挺多的,现在就学习一下这个工具的用法,顺便复 ...
- 《maven实战》笔记(2)----一个简单maven项目的搭建,测试和打包
参照<maven实战>在本地创建对应的基本项目helloworld,在本地完成后项目结构如下: 可以看到maven项目的骨架:src/main/java(javaz主代码)src/test ...
- 创建第一个spirngmvc小项目
题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...
- 又见angular----步一步做一个angular4小项目
这两天看了看angular4的文档,发现他和angular1.X的差别真的是太大了,官方给出的那个管理英雄的Demo是一个非常好的入门项目,这里给出一个管理个人计划的小项目,从头至尾一步一步讲解如何去 ...
- 关于Hibernate的一个简单小程序
本人根据视频学习了一下三大框架中比较简单的一个Hibernate,并简单完成了一个运用Hibernate的小程序 Hibernate是一个简化web程序Dao层的一个框架,应用他,可以完全脱离sql语 ...
- vue-cli安装以及创建一个简单的项目(二)(vuex使用、发行一个简单的app)
1.vuex的使用 vuex是vue的状态管理中心,vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,常用于: 1.多个视图依赖同一状态(l例:菜单导航) 2.来自不同 ...
- Scrapy框架简介及小项目应用
今天来总结一下Scrapy框架的用法.scrapy的架构如下: Engine :引擎,处理整个系统的数据流处理.触发事务,是整个框架的核心. Items :项目,它定义了爬取结果的数据结构,爬取的数 ...
- 软件----- idea 配置创建一个简单javase项目
1.显示工具栏和工具按钮,勾选上 如图,在左侧会增加对应的 2.设置项目结构,选择jdk 点击new 选择需要jdk 3.创建一个简单的java文件,和eclipse与myeslipse 差不多, ...
随机推荐
- 数据结构(三十四)最短路径(Dijkstra、Floyd)
一.最短路径的定义 在网图和非网图中,最短路径的含义是不同的.由于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径:而对于网图来说,最短路径是指两顶点之间经过的边上权值之 ...
- Unity 单例模式
明天十一放假,今天不知什么原因看到一篇unity单例模式的介绍,瞬间来了戾气. (一)最简单的单利 public class WebRequestUtility : MonoBehaviour { p ...
- django-URL之从URL中获取关键字(七)
主要用于查询操作. 主要目录 book/views.py from django.http import HttpResponse from django.shortcuts import rende ...
- 一篇文章让你彻底理解java中抽象类和接口
目录 1.我所理解的抽象类 2.我所理解的接口 3.抽象类和接口本质区别 相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编 ...
- pymssql连接Azure SQL Database
使用pymssql访问Azure SQL Database时遇到"DB-Lib error message 20002, severity 9:\nAdaptive Server conne ...
- 学习笔记51_MongoDB使用
MongoDB的包: 例如:设置Mongodb端口 在命令行: F:\MongoDB>mongod.exe --port:3306 做集群: 安装和使用: 1.在服务中添加MongoDB ( 指 ...
- postman发送json参数到后端controller报错415的解决方案
警告 [http-nio-8080-exec-9] org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.l ...
- elasticsearch操作命令
总结几个es的curl操作命令: 查询某条数据:curl -XGET http://elasticsearch:9200/company/company/123?pretty 查询索引下数据总量:cu ...
- GitHub_Hexo_Next 搭建博客
利用最新版本的 hexo+next 重构了个人博客,下面简单记录了搭建博客的完整过程: 一.环境准备 1.安装 Node.js 2.安装 Git 3.注册 Github 账号 二.在GitHub上创建 ...
- Java 博客系统 Tale
Tale Tale的英文含义为故事,我相信每个坚持写Blog的人都是有故事的:中文你叫它 塌了 也无所谓 . Tale 使用了轻量级mvc框架 Blade 开发,默认主题使用了漂亮的 pinghsu, ...