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网络 ...
随机推荐
- Vue(一) 数据绑定和第一个Vue应用
学习 Vue.js 最有效的方法是查看官网文档 数据绑定和第一个Vue应用 先从一段简单的 HTML 代码开始,感受 Vue.js 最核心的功能. <!DOCTYPE html> < ...
- AI的新增功能(定义图案)(描边渐变)(图像描摹)5.1
1.定义图案:打开一个AI素材文件如图: 选择工具拖拽选择这个图案,选择“对象”“图案”“建立”完成图案的建立 此时会弹出图案选项对话框,改变拼贴类型,图案宽高,份数,不透明度,单击"完成“ ...
- SQL 常用判断语句
我们在做sql更新时,为防止sql重复执行报错,需要对所需要执行的对象进行判断是否存在: 常用判断脚本如下: 判断视图是否存在 IF object_id('viewname') IS not NULL ...
- SmartGit(我工作中使用git图形化界面工具)
http://www.syntevo.com/smartgit/ 这个工具用了快两年,之前在逸橙工作时同事(目前就职百姓网)推荐使用的,查看更改了哪些文档很方便,前天试用版过期,现在贴个 破解的链接 ...
- configparse 模块
config parser 用于解析配置文件的模拟 何为配置文件 包含配置程序信息的文件就是称为配置文件 什么样的数据应作为配置文件 需要该 但是不经常改的信息 例如数据文件的路径 db_pa ...
- leetCode 典型回溯例子
39题,翻译题目:给定一组候选集和一个目标值,在c的所有组合中,找出所有总和等于T的组合. 候选数组c中同一个数可以被选择多次(不限次数) 分析: 典型的回溯法应用 对数组里面的每个数,用递归的方式相 ...
- TTL集成门电路工作原理和电压传输特性
集成电路(Integrated Circuit 简称IC):即把电路中半导体器件,电阻,电容以及连线等制作在一块半导体基片上构成一个完整的电路,并封装到一个管壳内 集成电路的有点:体积小,重量轻,可靠 ...
- Java正则表达式的总结
Java正则表达式,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. 判断用户的输入是否符合实际需求. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.] ...
- Java基础-数据类型和包装类
数据类型 分为基本数据类型和引用数据类型 基本数据类型变量存储的就是数据本身,引用数据类型的变量是保存数据的空间地址 四种基本数据类型: 逻辑型 boolean 文本型 char 整数型 byte s ...
- CSS颜色
CSS 颜色 可以用以下方法来规定 CSS 中的颜色: · 十六进制色 十六进制值使用三个双位数来编写,并以 # 符号开头. · RGB 颜色 o 所有浏览器都支持 R ...