python爬虫基础小案例, scrapy框架,思路和经验你全都有。
目录
一、scrapy介绍
二、爬取步骤
三、代码
1、创建爬虫项目 scrapy startproject 项目名字 注意: 项目名字不能出现中文,也不能以数字开头。
2、创建爬虫文件
3.进入itmes.py
4.进入spiders
5.进入pipelines.py
四、运行scrapy 文件
一、scrapy介绍
简单介绍一下scrapy吧。
Scrapy 框架是一个基于Twisted的一个异步处理爬虫框架,应用范围非常的广泛,常用于数据采集、网络监测,以及自动化测试等。
Scrapy 框架主要由五大组件组成,它们分别是:
- 调度器(Scheduler) :它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- 下载器(Downloader) :负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理
- 爬虫(Spider):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)
- 实体管道(Item Pipeline):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
- Scrapy引擎(Scrapy Engine):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
这么说大家可能还是不太明白,直接上图(此图来自一位bilibili的up主):
步骤如下:
注:红色字体部分是给下一个步骤的数据
spiders url --》引擎(Scrapy Engine)url --》调度器 (Scheduler)请求 --》引擎(Scrapy Engine)请求 --》下载器(Downloader) 请求 --》互联网 数据 --》引擎(Scrapy Engine)数据 --》spiders 解析数据结果 --》引擎(Scrapy Engine)if(就交给管道下载数据) if(有 url 则重复上面步骤) 注意的一点是连个可以同时存在也可以单独存在
话不多说,直接开始干!!!!
二、爬取步骤
这次要爬取的是当当网中的电子书
点击此处,进入网址,可以看到很多的书。而我们需要的是数据:书的图片,书名,作者,价格
1.爬取思路
首先查看有多少页,会发现,这个网站没有页数,究其原因,是一个滚动条的 ajax 请求,当滚动条滑倒最底下的时候,就发出一条请求。说这么一堆可能听不懂,上图。
这时候你会发现里面多了很多条请求,我们直接看到最上面一条,因为是ajax的请求,肯定是一个json的一个嵌套格式,直接打开英文是”response“,中文是“响应”,我的是中文所以就点击响应,看看有没有我们所需要的数据。
有数据吧,那就是他了。
http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=63&end=83&category=QCWX&dimension=dd_sale&order=0
复制url 放到搜索栏里面在进行请求一次,检验一下是不是正确的。
结果如下,密密麻麻的数据,有密集恐惧症的估计得没,而我们今天的任务就是从这些数据中提取出我们想要的数据。
要多页爬取,所以我们还要刚才一样在操作一次,下一条的请求URL,和这条url有什么区别。
这时候就有两条url
http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=63&end=83&category=QCWX&dimension=dd_sale&order=0
http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=84&end=104&category=QCWX&dimension=dd_sale&order=0
规律找到了,很简单。start(从第几本书开始) end(结束的那一本书)
思路有了,那就开始写代码
三、代码
在python 中的 Terminal 也就是终端中,创建scrapy框架
1、创建爬虫项目 scrapy startproject 项目名字
注意: 项目名字不能出现中文,也不能以数字开头。
项目结构如下:玩过django的人应该都知道
2、创建爬虫文件
在spiders文件夹中创建爬虫文件 cd 项目的名字\项目的名字\spiders进入spiders文件后创建爬虫文件:创建爬虫文件 scrapy genspider 爬虫文件的名字 要爬取的网页
注:URL记得用 ” “包起来不然可能会报错
创建成功后会出现,也就是我们刚刚创建的文件夹
3.进入itmes.py
数据取到后接下里就是定义数据结构了
import scrapyclass ScrapyDyttCsdnItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()#定义好数据结构name = scrapy.Field() #书名author = scrapy.Field() #作者imgSrc = scrapy.Field() #图片price = scrapy.Field() #价格pass
4.进入spiders
进入我们刚刚创建好的文件 spiders文件下的 dytt.py
进入该文件,会发现,看注释
import scrapyclass DyttSpider(scrapy.Spider):name = 'dytt'#链接范围,不在该范围内的url请求,都会报错,一般只写域名allowed_domains = ['e.dangdang.com']#执行文件请求的url,也就是我们创建文件的是给的url,#但是又不懂是不是,这是因为框架内部的原因弄的,大家不用在意,把刚才的url重新复制在里面就可以了。
#改一下strat 和 end 这两个是前面提过的 strat=0 和 end=20
#意思也就是从索引0开始,一直到索引20,也就是21本书start_urls = ['http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=0&end=20&category=QCWX&dimension=dd_sale&order=0']def parse(self, response):
#页面返回来的数据全在response 中,response.text 看看数据有没有获取到print(response.text)
3、运行爬虫代码scrapy crawl 爬虫文件的名字eg: scrapy crawl dytt
密密麻麻的数据已经获取到了,说明代码已经好了,接下来就是解析数据了,看到这些数据别说是我们了,就算哪些最牛逼的大神都头痛,有没有好的办法呢?当然是有的。
既然书是从strat开始 end结束,那能不能只获取一本书呢。
试试,改 strat=0 和 end=0 只获取一本书
在浏览器输入 根改后的链接
http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=0&end=0&category=QCWX&dimension=dd_sale&order=0
结果如下,这样是不是就舒服多了,接下来就是了解 json 数据结构 ,找到我们需要数据的位置
结构已近给你们找好了,如果你们也想自己找的话可以试试,挺好玩的。
print(doc['data']["saleList"][0]['mediaList'][0]["authorPenname"]) #作者
print(doc['data']["saleList"][0]['mediaList'][0]["coverPic"]) #图片
print(doc['data']["saleList"][0]['mediaList'][0]["title"]) #书名字
print(doc['data']["saleList"][0]['mediaList'][0]["lowestPrice"]) #价格
那接下来就是解析数据了
import scrapy
import jsonclass DyttSpider(scrapy.Spider):name = 'dytt'#链接范围,不在该范围内的url请求,都会报错,一般只写域名allowed_domains = ['e.dangdang.com']#执行文件请求的url,也就是我们创建文件的是给的url,#但是又不懂是不是,这是因为框架内部的原因弄的,大家不用在意,把刚才的url重新复制在里面就可以了。#改一下strat 和 end 这两个是前面提过的 strat=0 和 end=20# 意思也就是从索引0开始,一直到索引20,也就是21本书start_urls = ['http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=0&end=20&category=QCWX&dimension=dd_sale&order=0']def parse(self, response):json_list = json.loads(response.text)# json_list['data']['saleList'] 获取每一本书的信息for i in json_list['data']['saleList']: #遍历每一本书 获取其中需要的数据author = i['mediaList'][0]["authorPenname"]imgSrc = i['mediaList'][0]["coverPic"]name = i['mediaList'][0]["title"]price =i['mediaList'][0]["lowestPrice"]print(author,name,imgSrc,price)
获取数据如下:
这样是不是就舒服多了
接下来把解析好的数据 给 items.py 中的类,让items.py 给数据进行封装 dict 字典格式
import scrapy
import jsonclass DyttSpider(scrapy.Spider):name = 'dytt'#链接范围,不在该范围内的url请求,都会报错,一般只写域名allowed_domains = ['e.dangdang.com']#执行文件请求的url,也就是我们创建文件的是给的url,#但是又不懂是不是,这是因为框架内部的原因弄的,大家不用在意,把刚才的url重新复制在里面就可以了。#改一下strat 和 end 这两个是前面提过的 strat=0 和 end=20# 意思也就是从索引0开始,一直到索引20,也就是21本书start_urls = ['http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=0&end=20&category=QCWX&dimension=dd_sale&order=0']def parse(self, response):json_list = json.loads(response.text)# json_list['data']['saleList'] 获取每一本书的信息for i in json_list['data']['saleList']: #遍历每一本书 获取其中需要的数据author = i['mediaList'][0]["authorPenname"]imgSrc = i['mediaList'][0]["coverPic"]name = i['mediaList'][0]["title"]price =i['mediaList'][0]["lowestPrice"]#导入items.py 中的类 也就是我们刚刚定义好的数据结构 会定义成一个字典格式的数据结构from scrapy_dytt_csdn.items import ScrapyDyttCsdnItembook = ScrapyDyttCsdnItem(author=author,imgSrc=imgSrc,name=name,price=price)
最后就是下载数据,需要交给管道,pipelines.py 文件
import scrapy
import jsonclass DyttSpider(scrapy.Spider):name = 'dytt'#链接范围,不在该范围内的url请求,都会报错,一般只写域名allowed_domains = ['e.dangdang.com']#执行文件请求的url,也就是我们创建文件的是给的url,#但是又不懂是不是,这是因为框架内部的原因弄的,大家不用在意,把刚才的url重新复制在里面就可以了。#改一下strat 和 end 这两个是前面提过的 strat=0 和 end=20# 意思也就是从索引0开始,一直到索引20,也就是21本书start_urls = ['http://e.dangdang.com/media/api.go?action=mediaCategoryLeaf&promotionType=1&deviceSerialNo=html5&macAddr=html5&channelType=html5&permanentId=20220424124301850188613824148624365&returnType=json&channelId=70000&clientVersionNo=6.8.0&platformSource=DDDS-P&fromPlatform=106&deviceType=pconline&token=&start=0&end=20&category=QCWX&dimension=dd_sale&order=0']def parse(self, response):json_list = json.loads(response.text)# json_list['data']['saleList'] 获取每一本书的信息for i in json_list['data']['saleList']: #遍历每一本书 获取其中需要的数据author = i['mediaList'][0]["authorPenname"]imgSrc = i['mediaList'][0]["coverPic"]name = i['mediaList'][0]["title"]price =i['mediaList'][0]["lowestPrice"]#导入items.py 中的类 也就是我们刚刚定义好的数据结构 会定义成一个字典格式的数据结构from scrapy_dytt_csdn.items import ScrapyDyttCsdnItembook = ScrapyDyttCsdnItem(author=author,imgSrc=imgSrc,name=name,price=price)#把数据交给管道 piplines.py 进行数据的下载yield book
5.进入pipelines.py
进行数据的下载
class ScrapyDyttCsdnPipeline:#程序执行前第一个开始此方法,该方法是框架内置方法,方法名一定不能修改,否则会报错def open_spider(self):#打开文件self.fp = open("book.json",'w',encoding='utf-8')def process_item(self, item, spider):#item 中就是 dytt.py 文件中 yield book 中返回的数据#注意 item 要转化成字符串类型,否则会报错self.fp.write(str(item))return itemdef closer_spider(self):#关闭文件self.fp.close()
让后在settings.py 文件中把这一行的注释解开,也就是打开管道,管道不带开,数据怎么进去呢,更别提下载数据了。
为了方便大家寻找 进入settings 文件后 按住 crat+f 进行搜索这个 ITEM_PIPELINES,就能找到了
四、运行scrapy 文件
在终端 输入
scrapy crawl 爬虫文件的名字
scrapy crawl dytt
输入之后进行按下回车 就可以了
最后文件book.json 文件会在 spiders文件夹下
总共105条,一本书5条数据
105/5=21(本)
所有数据都在这里了,一点都没漏,Perfect!!!
还有不懂的地方可以评论,看到了会及时回复的,谢谢大家的支持。
python爬虫基础小案例, scrapy框架,思路和经验你全都有。相关推荐
- python爬虫的基本原理以及scrapy框架的使用
正则表达式基础 正则表达式用于处理字符串,拥有自己独立的语法以及一个独立的处理引擎. 不同提供正则表达式的语言里正则表达式的语法都式一样. . 和 * + . 匹配任意一个字符 *匹配0或多次前面出现 ...
- [python爬虫之路day19:] scrapy框架初入门day1——爬取百思不得姐段子
好久没学习爬虫了,今天再来记录一篇我的初入门scrapy. 首先scrapy是针对大型数据的爬取,简单便捷,但是需要操作多个文件以下介绍: 写一个爬虫,需要做很多的事情.比如: 发送网络请求, 数据解 ...
- 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息
使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...
- Python爬虫基础:安装Scrapy爬虫框架和创建Scrapy爬虫项目
首先为了避免国外镜像不稳定,我们使用了清华大学的python库镜像:https://pypi.tuna.tsinghua.edu.cn/simple 1.安装scrapy 1.1.安装pywin32( ...
- Python爬虫进阶三之Scrapy框架安装配置
初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...
- Python 爬虫进阶三之 Scrapy 框架安装配置
初级的爬虫我们利用 urllib 和 urllib2 库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架 Scrapy,这安装过程也是煞费苦心哪,在此整理如下. 官网 官方安装文档 安装p ...
- Python爬虫实战之利用Scrapy框架爬取传智播客课程数据
1.文件结构: 2.lesson.py代码 import scrapy from ts.items import TsItem from scrapy.http import Requestclass ...
- Python 爬虫的小案例(男性福利)
成果 源码 import os import random import ssl import timessl._create_default_https_context = ssl._create_ ...
- 爬虫 第六讲 Scrapy框架
文章目录 爬虫 第六讲 Scrapy框架 一.Scrapy框架 Scrapy简介 工作流程 Scrapy入门 pipline使用 1.scrapy.Request知识点 2.item的介绍和使用 3. ...
最新文章
- 下面关于表单的叙述错误的是_下面是关于表单数据环境的叙述,其中错误的是A.可以在数据环境中加入与表单操作有关的表B.数据环...
- 线性选择算法的递归实现和循环实现
- java10下编译lombok注解的代码
- hdfs统计某个目录下的文件数
- 获取本机IP_考虑多网卡的情况
- android 请求网络异步载入
- 记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了
- webpack项目搭建
- C语言和设计模式(解释器模式)
- 如何对SQL Server实例执行性能测试
- Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery
- MacOS实现MSDOS格式化为NTFS文件系统
- Quartz.NET 学习相关博客
- PMP新考纲启用,如何判断是敏捷?第6版教材与第7版有什么区别?
- 单片机 上传服务器协议,单片机数据上传到云服务器
- Mysql 索引模型 B+ 树详解
- docker安装mysql8 并且忽略大小写问题解决
- 程序员杂志在线阅读 豆瓣的架构—专访豆瓣网站的技术总监洪强宁
- 为什么要进行系统拆分?
- Java中类、抽象类、接口的联系与区别
热门文章
- iOS11 自定义UIBarButtonItem显示异常解决方案
- Photoshop文字之——制作逼真的镀金字特效
- 操作系统实验五--存储管理
- NAND闪存改变了现代生活
- SSD主控与NAND闪存之多通道交互
- springboot jar包瘦身
- ArcEngine Error: R6034 Runtime Error! An application has made an attempt to load the C runtime ...
- 最好看的10部美剧推荐,如不赞同评论区见
- 最新EyouCMS响应式少儿舞蹈培训网站模板源码
- 羊城杯 Crypto RRRRRRRSA (连分数,低解密指数攻击原理)