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 差不多, ...
随机推荐
- 微软宣布加入 OpenJDK,看网上各派的热闹
微软宣布加入 OpenJDK 项目(https://www.oschina.net/news/111036/microsoft-to-participate-in-openidk),这两天在微信公众号 ...
- 框架搭建与EF常用基类实现
前两篇简单谈了一些.Net Core的优势以及机构设计的一些思路,这一篇开始,我们将从零开始搭建架构,底层我们将采用EF来访问数据库,所以这篇我们将贴一下EF常用操作的基类. 简单介绍下一些类库将要实 ...
- xml 需要转义的字符
XML实体中不允许出现"&","<",">"等特殊字符,否则XML语法检查时将出错,如果编写的XML文件必须包含这些字符 ...
- 学习笔记33_EF跨数据库
在App.Config中,可以: (1)自定义类 public xxxxDbContext() { public XXXXDbContext():base("name=xxxxContain ...
- Java学习总结之方法重载和方法重写
在学习方法的阶段我学习了方法重载(Overload),而在学习面向对象三大特性之继承的时候我又学习了方法重写(Override). 概念: 方法重载:在同一个类中,允许存在一个以上的同名方法,只要 ...
- java应用性能调优之详解System的gc垃圾回收方法
一.什么是System.gc()? System.gc()是用Java,C#和许多其他流行的高级编程语言提供的API.当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象).名词解释:GC, ...
- 最适合Java开发者的一本书和一软件
一书-<Java编程思想> 一软件-IntelliJ IDEA Java自学是否可以成功,答案显而易见,可以. 自学Java关键看自己是否有毅力.是否有恒心. 自学Java 自学Java不 ...
- JavaScript入门经典(第7版)读书笔记
断断续续看了十来天,终于看完了,还是学到些东西,这本书还是不错的,各方面都有涉及. 补充了下之前不完善的JS 知识 笔记一般只记必要的东西. Table of Contents 1. JavaScr ...
- oracle直接调用web services
oracle调用C#开发web services 1, 去oracle官网上下载dbws-callout-utility-10131.zip 地址:https://oracle-base.com/a ...
- Jsp自学2
Jsp简单来说就是java代码与Html代码的组合,类,方法,属性跟网页展示夹杂在一起.Jsp就是Servlet,但比Servle简单,不需要配置web.xml(当然也可以配置).Jsp由模板数据与元 ...