python爬虫之scrapy框架总结

1.创建项目scrapy startproject projectname

tutorial/
scrapy.cfg
tutorial/
init.py
items.py
pipelines.py
settings.py
spiders/
init.py
myspider.py #自定义爬虫实现
...
这些文件分别是:

scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.

3.item
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()

4.scrapy crawl dmoz

5.开始抓取, start_urls,start_requests
import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
6.response.url当前连接
.response.body当前连接
Selector有四个基本的方法(点击相应的方法可以看到详细的API文档):

xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.
extract(): 序列化该节点为unicode字符串并返回list。
re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

7.全局命令:

startproject
settings
runspider
shell
fetch
view
version
项目(Project-only)命令:

crawl
check
list
edit
parse
genspider
deploy
bench

scrapy.Spider 股票,论坛
Scrapy.request 连环跳

CrawlSpider 百度百科
rules = (

提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)

Rule(LinkExtractor(allow=('category.php', ), deny=('subsection.php', ))),

提取匹配 'item.php' 的链接并使用spider的parse_item方法进行分析

Rule(LinkExtractor(allow=('item.php', )), callback='parse_item'),
)

XMLFeedSpider 提取XML

CSVFeedSpider 提取CSV

SitemapSpider XML 站点提取

9Item Loaders
默认从parse返回输入
输出,指定

自定义--
name = scrapy.Field(
input_processor=MapCompose(remove_tags),
output_processor=Join(),
)

10.scrapy shell <url> 测试,数据抓取

11 pipline,去重,处理写入txt,数据库,json,xml

def process_item(self, item, spider):
区分spider
if spider.name=="name":

if item['id'] in self.ids_seen:#去重,保存
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item

为了启用一个Item Pipeline组件,你必须将它的类添加到 ITEM_PIPELINES 配置,就像下面这个例子:

ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}
分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。

13.scarpy crawl spider -o 1.xml 1.csv 1.json 1.txt

14.百度百科,抓取邮箱
Link Extractors

15
Log levels
Scrapy提供5层logging级别:

CRITICAL - 严重错误(critical)
ERROR - 一般错误(regular errors)
WARNING - 警告信息(warning messages)
INFO - 一般信息(informational messages)
DEBUG - 调试信息(debugging messages)
from scrapy import log
log.msg("This is a warning", level=log.WARNING)

16.每个爬虫抓取完成数据之后,信息存储
spider_stats
保存了每个spider最近一次爬取的状态的字典(dict)。该字典以spider名字为键,值也是字典

from scrapy.mail import MailSender
mailer = MailSender()
或者您可以传递一个Scrapy设置对象,其会参考 settings:
mailer = MailSender.from_settings(settings)
这是如何来发送邮件了(不包括附件):
mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"])

18中间件--
模拟浏览器 --下载中间件
代理
selenium--spider中间件
splash
cookie
不遵守协议
配置多线程

19
调试
scarpy shell
日志
浏览器

20.Spiders Contracts 单元测试 了解

21运行爬虫的风格 了解
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from testspiders.spiders.followall import FollowAllSpider
from scrapy.utils.project import get_project_settings

spider = FollowAllSpider(domain='scrapinghub.com')
settings = get_project_settings()
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run() # the script will block here until the spider_closed signal was sent

一个进程运行多个爬虫
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log
from testspiders.spiders.followall import FollowAllSpider
from scrapy.utils.project import get_project_settings

def setup_crawler(domain):
spider = FollowAllSpider(domain=domain)
settings = get_project_settings()
crawler = Crawler(settings)
crawler.configure()
crawler.crawl(spider)
crawler.start()

for domain in ['scrapinghub.com', 'insophia.com']:
setup_crawler(domain)
log.start()
reactor.run()

22反爬虫
使用user agent池,轮流选择之一来作为user agent。池中包含常见的浏览器的user agent(google一下一大堆)
禁止cookies(参考 COOKIES_ENABLED),有些站点会使用cookies来发现爬虫的轨迹。
设置下载延迟(2或更高)。参考 DOWNLOAD_DELAY 设置。
如果可行,使用 Google cache 来爬取数据,而不是直接访问站点。
使用IP池。例如免费的 Tor项目 或付费服务(ProxyMesh)。
使用高度分布式的下载器(downloader)来绕过禁止(ban),您就只需要专注分析处理页面。这样的例子有: Crawlera

23通用爬虫 了解
增加全局并发数:
CONCURRENT_REQUESTS = 100

禁止cookies:

COOKIES_ENABLED = False

禁止重试:

RETRY_ENABLED = False

减小下载超时:

DOWNLOAD_TIMEOUT = 15

关闭重定向:

REDIRECT_ENABLED = False

提取ajax

AJAXCRAWL_ENABLED = True

23.selenium+中间调用任何浏览器

24.不要再内存list,dict中存储数据,否则溢出

25ImagesPipeline存储图片

26Scrapyd 部署管理

27限制速度
AUTOTHROTTLE_ENABLED

默认: False

启用AutoThrottle扩展。

AUTOTHROTTLE_START_DELAY
默认: 5.0

初始下载延迟(单位:秒)。

AUTOTHROTTLE_MAX_DELAY
默认: 60.0

在高延迟情况下最大的下载延迟(单位秒)。

AUTOTHROTTLE_DEBUG
默认: False

起用AutoThrottle调试(debug)模式,展示每个接收到的response。 您可以通过此来查看限速参数是如何实时被调整的。

28 scrapy bench测试最大并发

29 暂停继续
scrapy crawl somespider -s JOBDIR=crawls/somespider-1

30自定义改造scrapy替换 了解

31

针对当前爬虫的设置,不覆盖全局 了

SETTINGS_PRIORITIES = {
'default': 0,
'command': 10,
'project': 20,
'cmdline': 40,
}
32了解异常

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 文件目录说明: scrapy.cfg: 项目的配置文件 tutorial/: 该项目的python模块。之后您将在...
    关键先生耶阅读 561评论 0 0
  • 生成项目 scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。 打...
    温柔的倾诉阅读 2,132评论 1 0
  • 1.框架架构图: 2.各文件功能 scrapy.cfg 项目的配置文件items.py 定义了Item数据结构,...
    朝畫夕拾阅读 292评论 0 0
  • 此环节是在MAC OS中进行搭建 安装scrapy pip install scrapy即可快速完成安装 创建项目...
    abeb6ca9bb86阅读 603评论 0 2
  • 本周休年假,好久没有过暑假了。 在老家的日子真心安逸,几乎是十年,二十年如一日。起初是八点多才醒,后来睡的早,生物...
    聂Lydia阅读 176评论 0 0