scrapy框架学习之路
- 一、基础学习
- scrapy框架- 介绍:大而全的爬虫组件。
- 安装:
- - Win:
- 下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
- pip3 install wheel
- pip install Twisted‑18.4.‑cp36‑cp36m‑win_amd64.whl
- pip3 install pywin32
- pip3 install scrapy
- - Linux:
- pip3 install scrapy
- 使用:
- Django:
- # 创建project
- django-admin startproject mysite
- cd mysite
- # 创建app
- python manage.py startapp app01
- python manage.py startapp app02
- # 启动项目
- python manage.runserver
- Scrapy:
- # 创建project
- scrapy startproject xdb
- cd xdb
- # 创建爬虫
- scrapy genspider chouti chouti.com
- scrapy genspider cnblogs cnblogs.com
- # 启动爬虫
- scrapy crawl chouti
- . 创建project
- scrapy startproject 项目名称
- 项目名称
- 项目名称/
- - spiders # 爬虫文件
- - chouti.py
- - cnblgos.py
- ....
- - items.py # 持久化
- - pipelines # 持久化
- - middlewares.py # 中间件
- - settings.py # 配置文件(爬虫)
- scrapy.cfg # 配置文件(部署)
- . 创建爬虫
- cd 项目名称
- scrapy genspider chouti chouti.com
- scrapy genspider cnblgos cnblgos.com
- . 启动爬虫
- scrapy crawl chouti
- scrapy crawl chouti --nolog
- 总结:
- - HTML解析:xpath
- - 再次发起请求:yield Request对象
二、eg:爬取抽屉
- # -*- coding: utf- -*-
- import scrapy
- from scrapy.http.response.html import HtmlResponse
- # import sys,os,io
- # sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
- class ChoutiSpider(scrapy.Spider):
- name = 'chouti'
- allowed_domains = ['chouti.com']
- start_urls = ['http://chouti.com/']
- def parse(self, response):
- # print(response,type(response)) # 对象
- # print(response.text)
- """
- from bs4 import BeautifulSoup
- soup = BeautifulSoup(response.text,'html.parser')
- content_list = soup.find('div',attrs={'id':'content-list'})
- """
- # 去子孙中找div并且id=content-list
- f = open('news.log', mode='a+')
- item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
- for item in item_list:
- text = item.xpath('.//a/text()').extract_first()
- href = item.xpath('.//a/@href').extract_first()
- print(href,text.strip())
- f.write(href+'\n')
- f.close()
- page_list = response.xpath('//div[@id="dig_lcpage"]//a/@href').extract()
- for page in page_list:
- from scrapy.http import Request
- page = "https://dig.chouti.com" + page
- yield Request(url=page,callback=self.parse) # https://dig.chouti.com/all/hot/recent/2
三、知识点
- 第一部分:scrapy框架
- . scrapy依赖twisted
- 内部基于事件循环的机制实现爬虫的并发。
- 原来的你:
- url_list = ['http://www.baidu.com','http://www.baidu.com','http://www.baidu.com',]
- for item in url_list:
- response = requests.get(item)
- print(response.text)
- 现在:
- from twisted.web.client import getPage, defer
- from twisted.internet import reactor
- # 第一部分:代理开始接收任务
- def callback(contents):
- print(contents)
- deferred_list = [] # [(龙泰,贝贝),(刘淞,宝件套),(呼呼,东北)]
- url_list = ['http://www.bing.com', 'https://segmentfault.com/','https://stackoverflow.com/' ]
- for url in url_list:
- deferred = getPage(bytes(url, encoding='utf8')) # (我,要谁)
- deferred.addCallback(callback)
- deferred_list.append(deferred)
- # # 第二部分:代理执行完任务后,停止
- dlist = defer.DeferredList(deferred_list)
- def all_done(arg):
- reactor.stop()
- dlist.addBoth(all_done)
- # 第三部分:代理开始去处理吧
- reactor.run()
- . scrapy
- 命令:
- scrapy startproject xx
- cd xx
- scrapy genspider chouti chouti.com
- scrapy crawl chouti --nolog
- 编写:
- def parse(self,response):
- # .响应
- # response封装了响应相关的所有数据:
- - response.text
- - response.encoding
- - response.body
- - response.request # 当前响应是由那个请求发起;请求中 封装(要访问的url,下载完成之后执行那个函数)
- # . 解析
- # response.xpath('//div[@href="x1"]/a').extract_first()
- # response.xpath('//div[@href="x1"]/a').extract()
- # response.xpath('//div[@href="x1"]/a/text()').extract()
- # response.xpath('//div[@href="x1"]/a/@href').extract()
- # tag_list = response.xpath('//div[@href="x1"]/a')
- for tag in tag_list:
- tag.xpath('.//p/text()').extract_first()
- # . 再次发起请求
- # yield Request(url='xxxx',callback=self.parse)
四、持久化
- 今日内容:scrapy
- - 持久化 pipeline/items
- - 去重
- - cookie
- - 组件流程:
- - 下载中间件
- - 深度
- 内容详细:
- . 持久化
- 目前缺点:
- - 无法完成爬虫刚开始:打开连接; 爬虫关闭时:关闭连接;
- - 分工明确
- pipeline/items
- a. 先写pipeline类
- class XXXPipeline(object):
- def process_item(self, item, spider):
- return item
- b. 写Item类
- class XdbItem(scrapy.Item):
- href = scrapy.Field()
- title = scrapy.Field()
- c. 配置
- ITEM_PIPELINES = {
- 'xdb.pipelines.XdbPipeline': ,
- }
- d. 爬虫,yield每执行一次,process_item就调用一次。
- yield Item对象
- 编写pipeline:
- from scrapy.exceptions import DropItem
- class FilePipeline(object):
- def __init__(self,path):
- self.f = None
- self.path = path
- @classmethod
- def from_crawler(cls, crawler):
- """
- 初始化时候,用于创建pipeline对象
- :param crawler:
- :return:
- """
- print('File.from_crawler')
- path = crawler.settings.get('HREF_FILE_PATH')
- return cls(path)
- def open_spider(self,spider):
- """
- 爬虫开始执行时,调用
- :param spider:
- :return:
- """
- print('File.open_spider')
- self.f = open(self.path,'a+')
- def process_item(self, item, spider):
- # f = open('xx.log','a+')
- # f.write(item['href']+'\n')
- # f.close()
- print('File',item['href'])
- self.f.write(item['href']+'\n')
- # return item # 交给下一个pipeline的process_item方法
- raise DropItem()# 后续的 pipeline的process_item方法不再执行
- def close_spider(self,spider):
- """
- 爬虫关闭时,被调用
- :param spider:
- :return:
- """
- print('File.close_spider')
- self.f.close()
- 注意:pipeline是所有爬虫公用,如果想要给某个爬虫定制需要使用spider参数自己进行处理。
scrapy框架学习之路的更多相关文章
- 自己的Scrapy框架学习之路
开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...
- 【SpringCloud之pigx框架学习之路 】2.部署环境
[SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.下载代码 git clone https://git.pig4c ...
- 【SpringCloud之pigx框架学习之路 】1.基础环境安装
[SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.Cmder.exe安装 (1) windows常用命令行工具 下 ...
- go server框架学习之路 - 写一个自己的go框架
go server框架学习之路 - 写一个自己的go框架 用简单的代码实现一个go框架 代码地址: https://github.com/cw731/gcw 1 创建一个简单的框架 代码 packag ...
- Scrapy框架学习 - 使用内置的ImagesPipeline下载图片
需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...
- Scrapy框架学习笔记
1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...
- Scrapy框架学习(一)Scrapy框架介绍
Scrapy框架的架构图如上. Scrapy中的数据流由引擎控制,数据流的过程如下: 1.Engine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取得URL. 2.En ...
- scrapy框架学习
一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...
- Scrapy框架学习参考资料
00.Python网络爬虫第三弹<爬取get请求的页面数据> 01.jupyter环境安装 02.Python网络爬虫第二弹<http和https协议> 03.Python网络 ...
随机推荐
- MySQL 占用cpu 100%
目前的线上数据库,分为主从两个库,从库用来做比较耗时的数据统计分析. 今天top了一下从库服务器,发现mysqld 在很长一段时间都占用105% cpu,一开始以为是从库在处理主库的binlog. 两 ...
- JavaScript操作BOM对象
1)windows对象 浏览器对象模型(BOM :Browser Object Model)是JavaScript的组成之一,它提供了独立于内容与浏览 器窗口进行交互的对象,使用浏览器对象模型可以 ...
- Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)
概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...
- 四:(之三)制作镜像和一些docker命令
3.DIY image 3.1如何去掉sudo权限命令,让当前用户拥有操作docker的权限? 3.2 制作一个image: 拉取一个非常小的base image,hello-world.其中是一个可 ...
- ORM版学员管理系统1
ORM版学员管理系统 班级表 表结构 class Class(models.Model): id = models.AutoField(primary_key=True) # 主键 cname = m ...
- dns资源记录类型
资源记录的定义格式: 语法:name [TTL] IN RR_TYPE value SOA: name:当前区域的名字,例如"magedu.com.",或者"2.168. ...
- Android : 基于alsa库的音乐播放
继上篇:Android : alsa-lib 移植 ,这篇随笔实现一个demo基于移植好的alsa库在Android平台上播放wav文件: 一.利用ffmeg将一个mp3文件转换成wav文件: (1) ...
- linux 创建安装redis服务
1.找下redis的官方的下载地址:http://download.redis.io/releases/redis-3.2.8.tar.gz 有最新的就下载最新 先下载解压跟安装 wget http ...
- 对FPGA的时钟资源理解(更新中)
7系列FPGA中包含了多达24个CMT(时钟管理单元)(实际上V7常见只有20个),MMCM和PLL均为时钟综合器,对外部输入时钟.内部时钟进行处理,生成需要的低抖动时钟.PLL是MMCM的功能子集, ...
- jdk,jre和jvm
JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库 JRE是Java Runtime En ...