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 差不多, ...
随机推荐
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?
原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...
- LeetCode 二叉树的层次遍历
第102题 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...
- (IDEA) 搭建Maven并使用Maven打包部署
1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...
- ThinkCMF 框架上的任意内容包含漏洞
0x01 背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者 ...
- Web for pentester_writeup之File Upload篇
Web for pentester_writeup之File Upload篇 File Upload(文件上传) Example 1 直接上传一句话木马,使用蚁剑连接 成功连接,获取网站根目录 Exa ...
- Web for pentester_writeup之Code injection篇
Web for pentester_writeup之Code injection篇 Code injection(代码注入) Example 1 <1> name=hacker' 添加一个 ...
- 【PyTorch教程】P2. Python编辑器的选择、安装及配置
温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...
- [考试反思]0921csp-s模拟测试49:困顿
太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...
- [考试反思]0825NOIP模拟测试30:没落
AB卷,15人. Lrefrain rank#1 179 skyh rank#2 122 116 108 54 42虽说还是不怎么样,但是有好转的迹象. 开卷审题,T1是个(假)期望,感觉也许还可做. ...
- 问题 A: 雷神领域
传送门 题目描述 L君,S大陆首屈一指的天才魔法师,创造了一个新魔法:雷神领域. 这个魔法会首先在地面上形成正方网格魔法阵列,然后在某些位置召唤雷电轴标.注意:一个位置只能有一个雷电轴标存在. 雷电 ...