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 是否跟进 就是按照提取连接规则进行提取
  • 运行原理


五、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相关推荐

  1. Python 网络爬虫笔记9 -- Scrapy爬虫框架

    Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  2. python创建scrapy_Python爬虫教程-31-创建 Scrapy 爬虫框架项目

    首先说一下,本篇是在 Anaconda 环境下,所以如果没有安装 Anaconda 请先到官网下载安装 Scrapy 爬虫框架项目的创建0.打开[cmd] 1.进入你要使用的 Anaconda 环境1 ...

  3. Python Scrapy爬虫框架实战应用

    通过上一节<Python Scrapy爬虫框架详解>的学习,您已经对 Scrapy 框架有了一个初步的认识,比如它的组件构成,配置文件,以及工作流程.本节将通过一个的简单爬虫项目对 Scr ...

  4. python的scrapy框架的安装_Python3环境安装Scrapy爬虫框架过程及常见错误

    Windows •安装lxml 最好的安装方式是通过wheel文件来安装,http://www.lfd.uci.edu/~gohlke/pythonlibs/,从该网站找到lxml的相关文件.假如是P ...

  5. linux scrapy 定时任务_2019Python学习教程(全套Python学习视频):Scrapy爬虫框架入门...

    Scrapy爬虫框架入门 Scrapy概述 Scrapy是Python开发的一个非常流行的网络爬虫框架,可以用来抓取Web站点并从页面中提取结构化的数据,被广泛的用于数据挖掘.数据监测和自动化测试等领 ...

  6. python scrapy框架 抓取的图片路径打不开图片_Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码...

    大家可以在Github上clone全部源码. 基本上按照文档的流程走一遍就基本会用了. Step1: 在开始爬取之前,必须创建一个新的Scrapy项目. 进入打算存储代码的目录中,运行下列命令: sc ...

  7. python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...

    小猪的Python学习之旅 -- 4.Scrapy爬虫框架初体验 Python 引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网 ...

  8. python爬虫框架——scrapy(1)scrapy爬虫框架介绍

    导语:(python语言中存在众多的爬虫框架,本文及接下来的几篇都只介绍scrapy框架) 一:整理scrapy爬虫框架组件的各种知识,了解爬虫机制的原理 1.scrapy架构: 各个组件: 引擎(E ...

  9. Python Scrapy爬虫框架爬取51job职位信息并保存至数据库

    Python Scrapy爬虫框架爬取51job职位信息并保存至数据库 -------------------------------- 版权声明:本文为CSDN博主「杠精运动员」的原创文章,遵循CC ...

最新文章

  1. linux 命令窗口美化,美化你的命令行终端Terminal
  2. git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
  3. 登录界面-安全密码设计
  4. linux很多程序都要本地编译,让C/C++程序一次编译可以发布到多版本Linux之上
  5. oraclesqldeveloper 批量插入多个存储过程_MongoDB如何批量执行写操作
  6. [CodeForces gym 102956 D] Bank Security Unification(位运算优化dp)
  7. mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复
  8. 网站用户修改密码源码(邮箱版)
  9. Hi3519V101/Hi3516AV200 (之)SDK 安装以及升级使用说明
  10. 数据科学包13-实例2:时间事件日志
  11. vue写一个简单的警察抓小偷的打字游戏
  12. 聚类法 人脸识别 matlab,声纹识别 快速概览 + 详细了解N:N聚类算法是如何应用的...
  13. 新浪xweibo代码架构分析(二次开发)
  14. FreePic2PDF制作书签
  15. 【大屏可视化模板】vue-dataV-echarts-elementul大屏数据可视化方案,屏幕适配方案等比例缩放
  16. Redis下载安装-Windows版本
  17. Mac重装系统-使用Mac笔记本制作U盘启动盘
  18. Linux下安装及配置Discuz论坛
  19. 地图可视化绘制 | R-tanaka/metR包 绘制3D阴影效果地图
  20. android埋点,Android自动埋点的一种实现

热门文章

  1. 生成对抗网络GAN论文总结+复现代码(已完成27篇,未完待续。。。)
  2. 单播通信、主播通信和广播通信
  3. Jenkins--CIServer的介绍
  4. 文件下载成excel
  5. 莎士比亚(50条名句)内容大全 - 谁料过去的繁华,化作今朝的泥土 - 作者 第7页
  6. Excel中vba 立即窗口使用方法详细介绍
  7. M的编程备忘录之Linux——基础开发工具
  8. OpenCV实战(2)——OpenCV核心数据结构
  9. HTCVIVE物体跟随手柄移动手柄叩击
  10. 《C++程序设计》在线平时作业2