scrapy学习笔记
参考
中文文档:http://scrapy-chs.readthedocs.io/zh_CN/0.24/index.html
初步使用
高级特性:
1.内置的数据抽取器css/xpath/re
2.(scrapy shell)交互式控制台用于调试数据抽取方法
3.内置对结果输出的的支持,可以保存为JSON,CSV,XML等
4.自动处理编码
5.支持自定义扩展
6.丰富的内置扩展,可用于处理
(1)cookies and session
(2)HTTP features like compression,authentication,caching
(3)user-agent spoofing
(4) robots.txt
(5) crawl depth restriction
7.远程调试scrapy
8.更多的支持,比如爬取xml,csv,自动下载图片
原理讲解
scrapy runspider somefile.py -o xx.csv
1.在somefile.py 文件中找到已定义的爬虫,然后通过抓取引擎运行爬虫
2.具体抓取过程
(1)使用start_urls作为初始url生成request,并默认把parse作为他的回调函数
(2)在parse中采用css选择器获得目标url,并注册parse_question作为目标url的回调函数
背后的处理
(1)请求被异步的调度,处理
(2)有一些参数可以控制过程,比如每个域名ip的并发请求数,请求之间的下载延迟(或者自动调节)
使用步骤:
安装步骤:
python2.7 pip lxml openssl scrapy
使用步骤:
创建工程
定义项目
写spider
配置项目pipeline
执行crawl
命令行工具
help 查看帮助信息 -h
version 查看版本信息, 参数:-v 查看各组件的版本信息
startproject 新建工程
genspider 产生一个spider 不同的spider名字需要不同
list 查看spider列表
view 在浏览器中查看页面源码显示
parse 固定使用的函数,解析页面
shell 调试数据,检测xpath,查看页面源码
runspider 运行一个爬虫
bench 执行基准检测,检测scrapy是否安装成功
重要组件
Spider是一个类,定义了怎样爬取一个网站,包括怎样跟踪链接,怎样提取数据
循环执行流程
产生初始请求requests 解析响应,parse response 使用选择器,selector 存储item
基类scrapy.Spider
(1)属性
name: spider名称,要求唯一 allowed_domains: 允许的域名 start_urls:初始urls custom_settings:个性化设置,会覆盖全局设置 crawler: 抓取器,spider将绑定到上面 settings: 配置实例,包含工程中所有的配置变量 logger: 日志实例
(2)方法
from_crawler(crawler, *args, **kwargs):类方法,用于创建spiders start_requests():生成初始的requests make_requests_from_url(url):根据url生成一个request parse(response): 用来解析网页内容 log(message[, level, component]):用来记录日志, 这里请使用logger属性记录日志 self.logger.info("visited success") close(reason): 当spider关闭时候调用的方法
(3)子类
CrawlSpider 最常用的spider,用于抓取普通的网页 rules:定义了一些抓取规则,链接怎么跟踪, 使用哪一个parse函数解析此链接 parse_start_url(response):解析初始url的相应 XMLFeedSpider CSVFeedSpider SitemapSpider
选择器selector
https://docs.scrapy.org/en/latest/topics/selectors.html 用来解析网页的库有很多,比如beautifulsoup,lxml,scrapy默认使用selector 实例化: text初始化 TextResponse对象初始化 xpath css re extract
items
编写形式
作用:定义要抽取的数据项
item pipelines
作用 1.清洗html数据 2.验证抓取到的数据 3.核查重复数据 4.将抓取到的数据存储到数据库中
feed exports
存储数据的抓取结果 格式: json json lines xml csv
重要对象
requests
初始化参数 class scrapy.http.Request( url[, callback, method="GET", header, body, cookies, meta, encoding="utf-8", priority=0 don't_filter=False, errback] ) 实例: 1.生成Request的方法 2.通过Request传递数据的方法 3.Request.meta 中的特殊关键字 子类 FormRequest登录网站 1.new parameter formdata 2.new class method:from_response
response
初始化参数 class scrapy.http.Response( url[, status=200, headers, body, flags]) 子类 scrapy.http.TextResponse(url,[,encoding]) scrapy.http.HtmlResponse(url) scrapy.http.http.XmlResponse(url)
logging
1.简单用法 import logging logging.warning("test") 2.通用的记录日志方法,可以加入日志的级别 import logging logging.log(logging.WARNING, "test") 3.通过logger记录日志 logger = logging.getLoger(__name__) logger.warning("this is a warning") settings文件中日志级别 LOG_FILE LOG_ENABLED LOG_ENCODING LOG_LEVEL LOG_FORMAT LOG_DATEFORMAT LOG_STDOUT
Stats Collections
Sending-email
项目实例
爬取西刺
(1)需求分析
使用单一ip抓取网页过程中,经常碰到ip被封的情况,现需要获取一批代理ip进行网页抓取
目前找到西刺网站,可以提供免费代理ip,先爬取ip,供日后使用
(2)网站结构分析
(3)存储方式
文本文件
csv文件
json文件
jsonlines文件
数据库
云存储
(4)代码结构
创建工程
编写item
编写spider
编写&配置pipeline
调试运行代码
爬虫原理
spiders:用户编写的可定制化部分,负责解析response,产生items和url
scrapy engine:负责组建之间的数据流转,当某个动作发生时触发事件
scheduler:接收requests,并把他们加入队列,以便后续调度
downloader:负责抓取网页,并传送给引擎,之后抓取结果将传给spider
downloader middlewares:位于引擎和下载器之间的钩子,处理传送到下载器requests和传送到引擎的response
spider middlewares:位于引擎和抓取器之间的一个钩子,处理抓取器的输入和输出
itemPipeline:负责处理item,典型的用途:清洗,验证,持久化
数据流:
由执行引擎控制,过程如下:
1.引擎打开一个网站(open a domain)找到处理该网站的spider,并向该spider请求第一个要爬取的url
2.引擎从spider中获取到第一个要爬取的url并在调度器scheduler以requests调度
3.引擎向调度器请求下一个要爬取的url
4.调度器返回下一个要爬取的url给引擎,引擎将url通过下载中间件(请求request方向)转发给下载器downloader
5.一旦页面下载完毕,下载器生成一个该页面的response,并将其通过下载中间件(返回response方向)发送给引擎
6.引擎从下载器中接受到response,并通过spider中间件(输入方向)发送给spider处理
7.spider处理response并返回爬取的item及新的request给引擎
8.引擎将spider爬取到的item返回给itemPipeline,将spider返回的response给调度器
9.从第二步重复,知道调度器中没有更多的request,引擎关闭该网站
项目实用技巧
需求分析
目标网站 天猫商城 https://www.tmall.com/
抓取内容 天猫商城销量前60
商品情况(商品价格,商品名称,商品url)
店铺情况(店铺名称,店铺url,公司名称,公司地址)
存储格式 excel表格
项目实施
代码解读
item编写
spider编写
settings设置
cmd : scrapy runspider tmallgoods.py -o data.csv
打开csv文件乱码,用notpad++,保存为asii编码格式
图片抓取
以上任务增加保存图片的功能
代理ip
原理:A用户 -> 在线代理服务器 -> 目标网站
实现方法
spider middlewares
downloader middlewares
具体实现
1.代理ip的抓取 西刺
2.代理ip的验证 socket
3.代理ip的使用 downloader middlewares
登陆的原理
身份识别 用户名 密码 秘钥
web中的身份识别
cookie 通过在客户端记录信息确定用户身份
实际上是一小段文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie,客户端浏览器会把cookie保存起来,当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同交给服务器,服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改的cookie的内容
session通过在服务器端记录信息确定用户身份
是一另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session,客户端浏览器再次访问时只需要从该session中查找该用户的状态就可以了
如果说cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么session机制就是通过检查服务器上的“客户明细表”来确认客户身份,session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了
登陆的方法
(1)FormRequest 用户名密码
(2)添加cookie到request中
cookie的处理
cookies middleware
手动定制
通过第三方工具执行js脚本 selenium
手动模拟js的执行
通过火狐浏览器监控页面链接
通过js代码获取必要的信息
from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.baidu.com") driver.page_source
scrapyd 是一个部署和云心scrapy spider 的应用,他可以使用Json api部署工程并控制spider
scrapyd 可以管理多个工程,并且每个工程都可以有多个版本,但只运行最新的那个版本
依赖: scrapy twisted
安装: pip install scrapyd
启动服务: cmd: scrapyd
上传工具:scrapyd-client
安装方法:pip install scrapyd-client
上传方法:python scrapyd-deploy target -p project
调度工具curl
调度爬虫
添加版本
调度spider执行
取消spider执行
列出工程
总结:
scrapy是什么 爬虫框架 调度,并发
scrapy基本使用 创建工程 编写item 编写spider 编写pipline 配置组件,运行爬虫
scrapy基本概念 request response
scrapy基本命令 调试网页
scrapy内置服务 状态收集,日志管理logging
爬虫原理 框架,scheduler spider downloader middleware pipline
多级页面抓取 不同页面获取信息
图片抓取 imagepipline
代理ip的使用 过多爬取网站,ip被禁用
cookies的原理 识别用户身份,登陆网站
js的处理技巧 selenium
scrapy的部署和调度 scrapyd curl
深入的内容
scrapy定制化,如:添加扩展,编写中间件
scrapy调度平台搭建
学习原则
多动手
多看源代码
多看官方文档
scrapy shell 加user agent
scrapy shell -s USER_AGENT=”Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36” url #url指你所需要爬的网址