Day537538539540541.scrapy爬虫框架 -python
scrapy爬虫框架
一、scrapy
scrapy是什么?
Scrapy是一个为了爬取网站数据
,提取结构性数据
而编写的应用框架
。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。安装scrapy
pip install scrapy
1、scrapy项目的创建以及运行
①创建scrapy项目
终端输入 scrapy startproject 项目名称
②项目组成
③创建爬虫文件
- 跳转到spiders文件夹
cd 目录名字/目录名字/spiders
- 创建爬虫文件.py
scrapy genspider 爬虫名字 网页的域名# 比如
scrapy genspider achang http://achang.cc
- 爬虫文件的基本组成:
继承scrapy.Spider类
class BaiduSpider(scrapy.Spider):# 爬虫的名字name = 'baidu'# 运行访问的域名allowed_domains = ['www.baidu.com']# 起始的url地址,指的是第一次访问的域名# start_urls 是在allowed_domains前面添加了'http://'# 在allowed_domains后面添加了'/'start_urls = ['http://www.baidu.com/']# 执行了start_urls之后 执行的方法 方法中的response就是返回的那个对象(相当于response = urllib.request.urlopen)def parse(self, response):print('阿昌来也')
④运行爬虫文件
scrapy crawl 爬虫名称# 例如
scrapy crawl achang
注意:应在spiders文件夹内执行
2、scrapy架构组成
3、scrapy工作原理
- 案例:汽车之家
scrapy genspider carhome car.autohome.com.cn/price/brand-12.html
注掉君子协议
carhome.py:
class CarhomeSpider(scrapy.Spider):name = 'carhome'allowed_domains = ['https://car.autohome.com.cn/price/brand-12.html']start_urls = ['https://car.autohome.com.cn/price/brand-12.html']def parse(self, response):name_list = response.xpath('//div[@class="main-title"]/a/text()')for item in name_list:print(item.extract())
二、yield
简要理解:
yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始
① 案例1:当当网
(1)yield(2).管道封装(3).多条管道下载 (4)多页数据下载
- settings.py: 设置项,设置多管道爬取
ITEM_PIPELINES = {# 管道可以有很多,那么管道是有优先级的,优先级为0-1000,值小 优先级越高'scrapy_dangdang.pipelines.ScrapyDangdangPipeline': 300,'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,#多条管道
}
- pipelines.py :管道,多管道爬取,一个下载对应的json,一个爬取下载对应的图片
import urllib.requestclass ScrapyDangdangPipeline:# 爬虫开始执行def open_spider(self,spider):self.fp = open('book.json','a',encoding='utf-8')# item就是yield返回的book对象def process_item(self, item, spider):# 操作文件过于频繁,不推荐# with open('book.json','a',encoding='utf-8') as fp:# fp.write(str(item))self.fp.write(str(item))return item# 爬虫结束执行def close_spider(self,spider):self.fp.close()# 开启多管道
# 1、定义管道类
# 2、在settings.py开启管道
# 'scrapy_dangdang.pipelines.DangDangDownloadPipeline': 301,#多条管道
class DangDangDownloadPipeline:def process_item(self, item, spider):filename = './book/'+item.get('name')+'.jpg'urllib.request.urlretrieve(url=item.get('src'),filename=filename)return item
- items.py 用于操作传递的模型(这里是爬取对应的数据)
class ScrapyDangdangItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 你要下载的数据都有什么?# 图片src = scrapy.Field()# 书名name = scrapy.Field()# 价格price = scrapy.Field()
- dang.py :爬虫主要业务逻辑
import scrapy
from scrapy_dangdang.items import ScrapyDangdangItemclass DangSpider(scrapy.Spider):name = 'dang'# 如果是多页下载的话,就必须跳转 allowed_domains 的范围,一般情况就写域名allowed_domains = ['ategory.dangdang.com']start_urls = ['http://category.dangdang.com/cp01.28.02.93.00.00.html']base_url = 'http://category.dangdang.com/cp'page = 1def parse(self, response):# 【书写爬虫逻辑】print('阿昌-----------来也')# pipelines.py 下载数据# items.py 定义数据结构# src = '//ul[@id="component_59"]/li//img/@src'# name = '//ul[@id="component_59"]/li//img/@alt'# price = '//ul[@id="component_59"]/li//p[@class="price"]/span[@class="search_now_price"]/text()'li_list = response.xpath('//ul[@id="component_59"]/li')for item in li_list:src = 'http:' + str(item.xpath('.//img/@data-original').extract_first())if src:src = srcelse:src = item.xpath('.//img/@src').extract_first()name = item.xpath('.//img/@alt').extract_first()price = item.xpath('.//p[@class="price"]/span[@class="search_now_price"]/text()').extract_first()# print(src, name, price)if src == 'http:None':src = 'http://img3m6.ddimg.cn/33/9/20531346-1_b_7.jpg'book = ScrapyDangdangItem(src=src, name=name, price=price)# yield是迭代器,将封装的book交给pipelinesyield book# 【页码爬取的回调】# 每一页爬取的业务逻辑都是一样的,所有只需要修改页码并再次调用即可if self.page < 100:# 根据对应规律整理出下次回调的url地址self.page = self.page + 1url = self.base_url + str(self.page) + '-cp01.28.02.93.00.00.html'# scrapy.Request 就是get请求# url就是请求地址# callback就是回调,也就是要执行的函数print(url, '我是url回调地址')yield scrapy.Request(url=url, callback=self.parse,dont_filter=True)
案例2:爬虫电影1天2堂
https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
创建项目:
scrapy startproject scrapy_movies
创建爬虫:
scrapy genspider mv https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
启动爬虫
scrapy crawl mv
settings.py:打开管道,这里也可以定义多个管道,模仿上面的当当网案例
pipelines.py:
class ScrapyMoviesPipeline:def open_spider(self,spider):self.fp = open('movie.json','w',encoding='utf-8')def process_item(self, item, spider):self.fp.write(str(item))return itemdef close_spider(self,spider):self.fp.close()
items.py: 指定要封装的爬取数据数据结构
class ScrapyMoviesItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()name = scrapy.Field()src = scrapy.Field()
spiders.mv.py:爬取第一页的电影名和在第一页中对应二级页的图片url
import scrapy
from scrapy_movies.items import ScrapyMoviesItemclass MvSpider(scrapy.Spider):name = 'mv'allowed_domains = ['www.dytt8.net']start_urls = ['https://www.dytt8.net/html/gndy/dyzz/list_23_1.html']def parse(self, response):print('--------')# 要第一页的电影名字和 第二页的图片地址a_list = response.xpath('//div[@class="co_content8"]//tr[2]/td[2]/b/a')print(a_list)for item in a_list:# 获取第一页name和之后第二页的地址name = item.xpath('./text()').extract_first()url = 'https://www.dytt8.net'+item.xpath('./@href').extract_first()# 对第二页连接发起访问,获取里面对应的图片# 通过meta={'name':name} 来为先调用的方法传递参数yield scrapy.Request(url=url,callback=self.parse_second,meta={'name':name})# 如果还要爬取第二页就在这里通过 yield再回调一次parse,并封装好后几页的url# yield scrapy.Request(url=’后面页数的url地址‘, callback=self.parse,dont_filter=True)# 获取第二页访问电影图片的爬虫逻辑# 此时response 就是访问第二页的响应内容def parse_second(self,response):# 注意:如果拿不到数据的情况下,一定要检查的xpath语法是否正确src = response.xpath('//div[@id="Zoom"]//img/@src').extract_first()# 从上面的meta中获取对应的name值name = response.meta['name']# 封装对象movie = ScrapyMoviesItem(src=src,name=name)# 将封装的对象返回给管道yield movie
三、pymysql的使用步骤
通过pymysql
,来将数据存入mysql数据库中
- 安装
pip install pymysql
- 连接数据库
pymysql.connect(host,port,user,password,db,charset)
conn.cursor()
- 执行sql
cursor.execute()
四、CrawlSpider
链接提取器,继承自scrapy.Spider
独门秘笈
CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求
所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的提取链接
- 模拟使用
- 提取连接
link.extract_links(response)
注意事项
- 【注1】callback只能写
函数名字符串
,不需要写圈函数带上()
, callback=‘parse_item’ - 【注2】在基本的spider中,如果重新发送请求,那里的callback写的是callback=self.parse_item
- 【注‐‐稍后看】follow=true 是否跟进 就是按照提取连接规则进行提取
- 【注1】callback只能写
运行原理
五、CrawlSpider案例
需求:读书网数据入库
- 创建项目
scrapy startproject scrapy_readbook
- 创建爬虫类
scrapy genspider -t crawl read https://www.dushu.com/book/1090.html
settings.py:开启管道
pipelines.py:指定管道逻辑,这里是保存对应内容为json文件,第二个通道来使用保存数据库的操作
from itemadapter import ItemAdapter
from scrapy.utils.project import get_project_settings
import pymysqlclass ScrapyReadbookPipeline:def open_spider(self, spider):self.fp = open('book.json', 'w', encoding='utf-8')def close_spider(self, spider):self.fp.close()def process_item(self, item, spider):self.fp.write(str(item))return item# 保存数据库的通道操作
class ScrapyDateBasesPipeline:def open_spider(self, spider):# DB_HOST = 'localhost'# DB_POST = 3306# DB_USER = 'root'# DB_PASSWORD = 'root'# DB_NAME = ''# DB_CHARSET = 'utf-8'settings = get_project_settings()self.host = settings['DB_HOST']self.port = settings['DB_POST']self.user = settings['DB_USER']self.password = settings['DB_PASSWORD']self.database = settings['DB_DATABASE']self.charset = settings['DB_CHARSET']self.connect()def connect(self):self.conn = pymysql.connect(host=self.host,port=self.port,user=self.user,password=self.password,charset=self.charset,db=self.database)#self.cursor = self.conn.cursor()def process_item(self, item, spider):sql = 'insert into demo01(name,src) values("{}","{}")'.format(item['name'],item['src'])# 执行sqlself.cursor.execute(sql)self.conn.commit()return itemdef close_spider(self, spider):self.conn.close()self.cursor.close()
- items.py:指定存储数据的结构
class ScrapyReadbookItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()name = scrapy.Field()src = scrapy.Field()
- spiders.read.py:实际爬虫业务内容
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_readbook.items import ScrapyReadbookItemclass ReadSpider(CrawlSpider):name = 'read'allowed_domains = ['www.dushu.com']start_urls = ['https://www.dushu.com/book/1090_1.html']rules = (# allow指定后面页数的正则规则# follow=True 直接爬完Rule(LinkExtractor(allow=r'/book/1090_\d+\.html'),callback='parse_item',follow=True),)def parse_item(self, response):img_list = response.xpath('//div[@class="bookslist"]/ul//img')for item in img_list:src = item.xpath('./@data-original').extract_first()name = item.xpath('./@alt').extract_first()book = ScrapyReadbookItem(name = name,src = src)yield book
六、scrapy的日志等级
七、scrapy的post请求
八、代理
Day537538539540541.scrapy爬虫框架 -python相关推荐
- Python 网络爬虫笔记9 -- Scrapy爬虫框架
Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...
- python创建scrapy_Python爬虫教程-31-创建 Scrapy 爬虫框架项目
首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Scrapy 爬虫框架项目的创建0.打开[cmd] 1.进入你要使用的 Anaconda 环境1 ...
- Python Scrapy爬虫框架实战应用
通过上一节<Python Scrapy爬虫框架详解>的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程.本节将通过一个的简单爬虫项目对 Scr ...
- python的scrapy框架的安装_Python3环境安装Scrapy爬虫框架过程及常见错误
Windows •安装lxml 最好的安装方式是通过wheel文件来安装,http://www.lfd.uci.edu/~gohlke/pythonlibs/,从该网站找到lxml的相关文件.假如是P ...
- linux scrapy 定时任务_2019Python学习教程(全套Python学习视频):Scrapy爬虫框架入门...
Scrapy爬虫框架入门 Scrapy概述 Scrapy是Python开发的一个非常流行的网络爬虫框架,可以用来抓取Web站点并从页面中提取结构化的数据,被广泛的用于数据挖掘.数据监测和自动化测试等领 ...
- python scrapy框架 抓取的图片路径打不开图片_Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码...
大家可以在Github上clone全部源码. 基本上按照文档的流程走一遍就基本会用了. Step1: 在开始爬取之前,必须创建一个新的Scrapy项目. 进入打算存储代码的目录中,运行下列命令: sc ...
- python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...
小猪的Python学习之旅 -- 4.Scrapy爬虫框架初体验 Python 引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网 ...
- python爬虫框架——scrapy(1)scrapy爬虫框架介绍
导语:(python语言中存在众多的爬虫框架,本文及接下来的几篇都只介绍scrapy框架) 一:整理scrapy爬虫框架组件的各种知识,了解爬虫机制的原理 1.scrapy架构: 各个组件: 引擎(E ...
- Python Scrapy爬虫框架爬取51job职位信息并保存至数据库
Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...
最新文章
- linux 命令窗口美化,美化你的命令行终端Terminal
- git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
- 登录界面-安全密码设计
- linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上
- oraclesqldeveloper 批量插入多个存储过程_MongoDB如何批量执行写操作
- [CodeForces gym 102956 D] Bank Security Unification(位运算优化dp)
- mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复
- 网站用户修改密码源码(邮箱版)
- Hi3519V101/Hi3516AV200 (之)SDK 安装以及升级使用说明
- 数据科学包13-实例2:时间事件日志
- vue写一个简单的警察抓小偷的打字游戏
- 聚类法 人脸识别 matlab,声纹识别 快速概览 + 详细了解N:N聚类算法是如何应用的...
- 新浪xweibo代码架构分析(二次开发)
- FreePic2PDF制作书签
- 【大屏可视化模板】vue-dataV-echarts-elementul大屏数据可视化方案,屏幕适配方案等比例缩放
- Redis下载安装-Windows版本
- Mac重装系统-使用Mac笔记本制作U盘启动盘
- Linux下安装及配置Discuz论坛
- 地图可视化绘制 | R-tanaka/metR包 绘制3D阴影效果地图
- android埋点,Android自动埋点的一种实现