这周对于Scrapy进一步学习,知识比较零散,需要爬取的网站因为封禁策略账号还被封了/(ㄒoㄒ)/~~

一、信息存储

1、log存储命令:scrapy crawl Test --logfile=test.log——把运行输出存入log当中

   也可以在代码中定义要存储的内容:self.log("Fetch home page: %s" % response.url)

2、将结果存文件

(1)法1:代码里增加如下几条语句

import sys
sys.stdout=open('output.txt','w')  ---------------存txt
sys.stdout=open('output.json','W') --------------存json
(2)法2:命令行——scrapy crawl Test  -o test.json -t json
二、Rule
在有些网络爬取过程中,要爬取的url并非全部是事先定义好的,而是一边爬取网页,一边不停的吸纳新的url,在脑海想象一下虫子爬行四面八方的赶脚...
在写爬虫的时候,首先要定义start_urls,它是一个待爬取页面的url队列。
当爬取一个页面时,会从这个页面获得n条url信息,有些种类的url需要加入上述url队列中,等待进一步爬取;有些种类的url需要进行立即爬取等等。
Rule的作用简单来说就是对不同类型的url定义不同的处理规则。
下面是一个小例子,注意几点:
(1)需要引入CrawlSpider和Rule,CrawlSpider是基于最基本的Spider,其定义了一些规则(rule)来提供跟进link的方便的机制。
(2)需要引入LinkExtractor
(3)Rule需要用到正则,正则以'\'作为标记,常用的几种:
[A-Z]{2}——两个大写字符

\w+ 相当于 [A-Za-z0-9_]+  ——  一到多个字母、数字、下划线(+:一到多个;*:0到多个)
\W+ 匹配的正好和\w+相反
(4)第一个Rule:符合正则的,加入url队列
第二个Rule:符合正则的,调用函数parseCom
Rule里面有几个参数,其中有一个叫做follow,它是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进,即是否加入url队列。 如果callback为None(第一个Rule),follow值为True,否则为False。

 1 # -*- coding: utf-8 -*-
 2 from scrapy.spiders import CrawlSpider,Rule
 3 from scrapy.linkextractors import LinkExtractor
 4 from scrapy.selector import Selector
 5 from scrapy.item import Item
 6 from qicha.items import QichaItem
 7
 8 class QichachaSpider(CrawlSpider):
 9     name = "qichacha"
10     allowed_domains = ["qichacha.com"]
11
12     start_urls = [
13         'http://www.qichacha.com/search_hangye',
14     ]
15     rules=(
16         Rule(LinkExtractor(allow=('/search_hangye\?&p=[0-9]+', ),)),
17         Rule(LinkExtractor(allow=('/firm\_[A-Z]{2}\w+', )), callback='parseCom'),
18     )
19     def parseCom(self,response):
20         print "********************************"
21         print response
22         sel=Selector(response)
23         items=[]
24         item=QichaItem()
25         item['name']='test'
26         item['website']='test'
27         items.append(item)
28         return items

三、带cookie的访问

  有些网站需要登录才可见,换句话说只有登录了才可以去爬数据,在这种情况下,每次爬取页面的时候把cookie带在请求信息里就可以了,即使有验证码也不怕。

  关于scrapy的cookie机制,我查资料的时候查到了一个cookielib包,因为懒没有去学,就是用最简单粗暴的方式把cookie加入请求信息当中,居然意外的可以。

  (1)首先登陆网站,然后利用浏览器查看一下当前网站的cookie,以豆瓣和chrome浏览器为例

  (2)把cookie那一串拷出来,改成"key":"value"的形式

  (3)再在类中加入下面一段代码,即把cookie放在请求信息当中,就可以了(我下面的cookie是虚构的,换成自己的就可以了)

1 def start_requests(self):
2         for url in self.start_urls:
3             yield Request(url,cookies={'PHPSESSID':'trvet','think_language':'zh-cn','CNZZD':'1916428848-1450-%7676488','pspt':'%722pswd%22%3A%22661bbde70%22%2C%22_cod27%22%7D','SERVERID':'a66d7dffe|145202|1450'})

  

  

四、几点注意与疑问

(1)有些网站不让频繁爬取,那就看情况time.sleep(10)一下,具体睡眠时间视情况而定

(2)更严格的要切账号(也就是cookie)和加代理,关于如何切代理我接下来再总结

(3)最恐怖的是把账号给封禁了,就比如我现在爬取的网站,除了多注册几个账号还有其他方式吗?

(4)关于爬取规则,我现在也搞不懂Scrapy是按什么规则进行爬取的,深度优先?广度优先?先不谈加Rule,即使在最初start_urls定义了一串连续的url,结果爬取的时候却不是按序的,不知道为什么?

五、第二个案例

  第二个案例现在还没弄完,是一个类似博客的网站,就假想成博客吧,第一层页面是博客列表,有n页;第二层页面是博客的具体内容,随便选一个例子。

1、法1:可以利用Rule

  (1)start_urls只插入一条初始页面的url,strat_urls=['http://www.cnblogs.com/v-July-v/']

(2)定义两个Rule,若是博客正文页面的链接就爬取,若是博客列表的链接就存入url队列

2、法2:不用Rule,分两步爬取

  (1)爬虫1:先把所有博客正文页面的链接爬取下来存入数据库或者文件中

  (2)爬虫2:把第一步获取的链接作为strat_urls,进行内容爬取

  这种方式的好处:可以加一个标记,标记页面是否爬过,这样就会使得整个爬虫过程可控一些,知道哪些爬过哪些没有爬过,第一种方式略乱一点对于我来说.....

转载于:https://www.cnblogs.com/naonaoling/p/5134080.html

scrapy再学习与第二个实例相关推荐

  1. Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  2. RTSP再学习 -- Hi3516A RTSP实例 分析

    上一篇文章,讲到了Hi3516A通过RTSP播放H.265视频流的源码.接下来对源码分析一下. 这里推荐一个工具,参看:日常生活小技巧 -- 文件对比工具 Beyond Compare (1)首先从 ...

  3. LIVE555再学习 -- testRTSPClient 实例

    上一篇文章简单看了一遍 testRTSPClient  的源码,接下来举几个应用实例加深一下. 首先什么都不做修改,先执行一遍,看一下. 一.执行 testRTSPClient 特么,上面的东西我没看 ...

  4. LIVE555再学习 -- testOnDemandRTSPServer 源码分析

    一.简介 先看一下官网上的介绍: testOnDemandRTSPServercreates a RTSP server that can stream, via RTP unicast, from ...

  5. UNIX再学习 -- 守护进程(转)

    参看:守护进程 一.什么是守护进程 守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程.它是一个生存期较长的进程,通常独立于控制 ...

  6. UNIX再学习 -- 文件描述符

    在 UNIX/Linux 系统中,一切皆文件,这句话想必都有听过.对于文件的操作几乎适用于所有的设备,这也就看出了文件操作的重要性了.在C语言再学习部分有讲过标准I/O文件操作,参看:C语言再学习 - ...

  7. UNIX再学习 -- shell编程

    UNIX环境高级编程看了三章,遇到不少重定向等shell命令.本想到Linux时再讲,看来有必要提前了.之前有看过一本<嵌入式Linux软硬件开发详解>这本书里有简单介绍了一部分shell ...

  8. C语言再学习 -- 输入/输出

    一.缓冲区 输入字符的立即回显是非缓冲或直接输入的一个实例,它表示你说键入的字符被收集并存储在一个被成为缓冲区的临时存储区域中.按下回车可使你所键入的字符块对程序变成可用. 为什么需要缓冲区?首先,将 ...

  9. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

最新文章

  1. 经典算法学习——冒泡排序
  2. 读取一个文件,获取其中出现次数最多的前五个字符以及次数
  3. hdu 4640(状压dp)
  4. wxWidgets:wxAuiNotebook类用法
  5. mysql 参照完整性规则_mysql参照完整性
  6. springMVC导入excel案例poi
  7. 初创企业融资应量力而行
  8. sql join中能否使用case when_SQL(五)——多表查询
  9. ICQ被购后看腾讯出击DST:迈出国际化的关键一步
  10. 计算机系统集成 行业标准,行业标准信息服务平台
  11. linux下c爬取天气的源码,一个在conky中实现获取本地天气的c源代码
  12. matlab电磁铁磁场,Matlab在电磁铁设计计算中的应用
  13. kingbase 数据库初始化失败
  14. 2022.11.11 英语背诵
  15. for和if嵌套使用
  16. label_studio自动预标注功能
  17. 坚果云网盘教你拥有这5个习惯 升职加薪不是梦
  18. 你想每天定时向你的女朋友发一句早安吗 ?教你实现一个微信机器人
  19. mysql设置外部ip访问
  20. 基于SVD算法的电影推荐系统实验

热门文章

  1. nslookup 使用说明
  2. 关于 m_pszAppName
  3. AAAI 2020 | 腾讯优图10篇论文入选,含速算识别、视频识别等主题
  4. ROBEL:谷歌推出低成本机器人训练平台
  5. PyTorch 深度学习模型压缩开源库(含量化、剪枝、轻量化结构、BN融合)
  6. oracle反复查询一个集合,oracle集合查询
  7. python的课程ppt_第4课 初识Python复习课程.ppt
  8. 3详细参数_大疆精灵3值得入手吗?最详细的实测体验,各种参数应有尽有!
  9. 【OpenCV】OpenCV函数精讲之 -- imread()函数
  10. CVPR2018 目标检测算法总览(最新的目标检测论文)