爬虫进阶:Scrapy入门
进阶前言
学Py和写爬虫都有很长一段时间了,虽然工作方面主要还是做Java开发,但事实上用python写东西真的很爽。之前都是用Requests+BeautifulSoup这样的第三方库爬一些简单的网站,好处简单上手快,坏处也明显,单线程速度慢,偶尔想要跑快点还得自己写多线程或者多进程。其实早已久仰Scrpay大名,无奈一直没有主动去接触,前不久买了一本相关的书籍,看完之后便陆陆续续试手了几个实战项目(后续介绍),现在应该算是半梦半醒迈入半个大门了。其实Java也有好几个不错的爬虫框架,那为什么不选择Java?呵呵,人生苦短,用Python没错,何况它现在这么火。
大多数学习是没有捷径的,如果你也想学Scrapy,根据个人经验,可以先买一两本相关书籍翻翻,然后写写小项目,接着再继续往深入学习,网上有很多不错的关于Scrapy的电子书,文末会推荐一波自己瞎逛已收藏的,可以根据自己的实际情况进行帅选和甄别。
目录结构
万事开头难,安装好Scrapy环境后输入命令scrapy startproject start
,这样就创建好了第一个scrapy项目,目录结构如下:
- start
- start
- spiders # 爬虫编写及存放的目录
- __init__.py
- __init__.py
- items.py # 定义爬虫数据结构的类
- middlewares.py # 定义一些中间件的类,包括代理、请求头这些
- pipelines.py # 数据流出的管道类,将爬取数据保存入库等
- settings.py # 配置相关类,包括像日志、middlewares和pipelines等
- scrapy.cfg # 主要用于将爬虫部署到第三方,一般可不理会
项目框架已经搭起来了,紧接着示例下如何第一个爬虫,可以自己在spiders
目录下手动创建爬虫类,也可以用scrapy提供的快捷命令scrapy genspider {spider-name} {target-website}
快速生成指定名称的目标站点爬虫(参考如下)。例如spider-name可以定义为example
,target-website指定为example.com
。
# -*- coding: utf-8 -*-
import scrapy
class ExampleSpider(scrapy.Spider):
name = 'example' # 爬虫名称,运行的时候需指定
allowed_domains = ['example.com'] # 允许爬取的域名
start_urls = ['http://example.com/'] # 第一个爬取的目标网址
def parse(self, response):
"""scrapy爬取完首个目标网页后会回调到这个方法"""
pass
更多优秀和详细的Scrapy入门知识应该从书中或者其它学习资源获取,最后再附上Scrapy学习必备的经典架构图:
Scrapy经典架构图
常见命令
这里记录和列举一些常用的scrapy命令及其作用:
命令 |
作用 |
可选参数 |
---|---|---|
scrapy startproject {project-name} |
创建scrapy项目 |
|
scrapy genspider {spider-name} {target-domain} |
创建目标站点指定名称爬虫 |
|
scrapy shell {url} |
调试抓取的指定网页 |
-s USER_AGENT='xxx',加上指定请求头 |
scrapy crawl {spider-name} |
运行指定爬虫 |
-o output.{json or xml or cvs},将抓取结果输出为指定格式文件保存; -s {CLOSESPIDER_PAGECOUNT or CLOSESPIDER_ITEMCOUNT}=n,抓取指定数量网页或ITEM后自动停止爬虫 |
scrapy check {spider-name} |
检测爬虫是否存在错误 |
学习资源
- scrapy-cookbook
- 网络爬虫教程
- Python3网络爬虫开发实战 (PS:有纸质书,在线只能看一部分)
参考链接
- 分布式监控系统Zabbix-添加windows监控主机
- 盘点世界十大著名黑客攻击事件
- AS3中的单件(Singleton)模式
- puremvc框架之hello world!
- windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
- puremvc框架之Command
- python sorted函数
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
- puremvc框架之proxy
- Oracle数据库冷备份与热备份操作梳理
- Oracle数据库重做日志及归档日志的工作原理说明
- 用vs.net2010做flex/flash/as3开发
- python中input()与raw_input()的区别到底是啥?
- VB下中文URL编码问题的解决
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android自定义View实现投票进度条
- 国外Reservo一款非常棒的商业图床程序
- 详解Android v1、v2、v3签名(小结)
- Android Studio项目适配AndroidX(Android 9.0)的方法步骤
- Android自定义View实现微信语音界面
- Android仿微信录音功能(录音后的raw文件转mp3文件)
- Android基于腾讯云实时音视频仿微信视频通话最小化悬浮
- Android自定义View之RadioGroup实现跨多行显示
- Android RadioGroup多行显示效果 解决单选问题
- RadioGroup实现单选框的多行排列
- Android实现悬浮窗全系统版本
- Android基础控件RadioGroup使用方法详解
- Android采用消息推送实现类似微信视频接听
- Android BottomSheet实现可拉伸控件
- Android自定义RecyclerView实现不固定刻度的刻度尺