scrapy再学习与第二个实例

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

1、信息存储chrome

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

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

二、将结果存文件浏览器

(1)法1:代码里增长以下几条语句cookie

     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
 
2、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

 

3、带cookie的访问网络

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

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

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

  (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'})

 

  

  

4、几点注意与疑问

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

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

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

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

5、第二个案例

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

一、法1:能够利用Rule

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

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

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

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

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

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

相关文章
相关标签/搜索