这周对于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。
 # -*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
from qicha.items import QichaItem class QichachaSpider(CrawlSpider):
name = "qichacha"
allowed_domains = ["qichacha.com"] start_urls = [
'http://www.qichacha.com/search_hangye',
]
rules=(
Rule(LinkExtractor(allow=('/search_hangye\?&p=[0-9]+', ),)),
Rule(LinkExtractor(allow=('/firm\_[A-Z]{2}\w+', )), callback='parseCom'),
)
def parseCom(self,response):
print "********************************"
print response
sel=Selector(response)
items=[]
item=QichaItem()
item['name']='test'
item['website']='test'
items.append(item)
return items

三、带cookie的访问

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

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

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

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

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

 def start_requests(self):
for url in self.start_urls:
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,进行内容爬取

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

scrapy再学习与第二个实例的更多相关文章

  1. Applet再学习

    ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...

  2. FFmpeg再学习 -- 硬件加速编解码

    为了搞硬件加速编解码,用了一周时间来看 CUDA,接下来开始加以总结. 一.什么是 CUDA (1)首先需要了解一下,什么是 CUDA. 参看:百度百科 -- CUDA 参看:CUDA基础介绍 参看: ...

  3. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  4. Selenium2学习-018-WebUI自动化实战实例-016-自动化脚本编写过程中的登录验证码问题

    日常的 Web 网站开发的过程中,为提升登录安全或防止用户通过脚本进行黄牛操作(宇宙最贵铁皮天朝魔都的机动车牌照竞拍中),很多网站在登录的时候,添加了验证码验证,而且验证码的实现越来越复杂,对其进行脚 ...

  5. Selenium2学习-014-WebUI自动化实战实例-012-Selenium 操作下拉列表实例-div+{js|jquery}

    之前已经讲过了 Selenium 操作 Select 实现的下拉列表:Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select,但是在实际的日 ...

  6. Selenium2学习-010-WebUI自动化实战实例-008-Selenium 操作下拉列表实例-Select

    此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,对下拉列表框 Select 的操作. 下拉列表是 Web UI 自动化测试过程中使用率非常高的,通常有两种形式的下拉列表,一 ...

  7. 学习KnockOut第二篇之Counter

                                                                        学习KnockOut第二篇之Counter        欲看此 ...

  8. 《Python基础教程(第二版)》学习笔记 -> 第二章 列表和元组

    本章将引入一个新的概念:数据结构. 数据结构是通过某种方式阻止在一起的数据元素的集合,这些数据元素可以是数字或者字符,设置可以是其他数据结构. Python中,最基本的数据结构是序列(Sequence ...

  9. Android再学习-20141022-Activity的生命周期

    20141022-Android再学习 如何在一个应用程序当中定义多个Activity 定义一个类,继承Activity 在该类当中,复写Activity当中的onCreate方法.onCreate( ...

随机推荐

  1. [洛谷P4430]小猴打架

    题目大意:有$n$个点,问有多少种连成生成树的方案. 题解:根据$prufer$序列可得,$n$个点的生成树有$n^{n-2}$个,每种生成树有$(n-1)!$种生成方案,所以答案是$n^{n-2}( ...

  2. BZOJ2809:[Apio2012]dispatching——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809 题面复制于:https://www.luogu.org/problemnew/show/155 ...

  3. 洛谷3690:【模板】Link Cut Tree——题解

    https://www.luogu.org/problemnew/show/P3690 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...

  4. bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)

    每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #i ...

  5. G - YYS FZU - 2278 数学期望 (大数)

    Yinyangshi is a famous RPG game on mobile phones. Kim enjoys collecting cards in this game. Suppose ...

  6. python升级引发的问题总结

    http://www.cnblogs.com/ajianbeyourself/p/4214398.html http://www.cnblogs.com/hanggegege/p/6993003.ht ...

  7. maven中用yuicompressor和closure-compiler对js、css文件进行压缩

    转载自:http://matychen.iteye.com/blog/1477350 项目采用maven构建的时候,需要压缩js,css等,网上找了相关资料,自己综合了下-  直接放代码: <! ...

  8. Python爬虫学习笔记之极限滑动验证码的识别

    代码: import time from io import BytesIO from PIL import Image from selenium import webdriver from sel ...

  9. 链表系列 - [LeetCode] 链表的交错重排L1,Ln,L2,Ln-1 ....

    其实一开始并没有想到时间上O(n)的方法,想到了也是空间复杂度是O(n)的(需要用到栈或者递归):链表分两段,用栈记录第一段的遍历过程. 后来经提示想到了,可以将第二段链表逆序.从而不需要额外的辅助空 ...

  10. 普通用户加sudo权限

    没配置之前希望在普通用户下,通过sudo命令,让用户暂时拥有root权限,并创建一个文件夹.很明显,失败了,错误原因是:该用户暂没有root权限.  解决办法如下 1.打开sudoers文件 切换到r ...