Scrapy常见问题(FAQ)

news/2024/7/19 10:33:54 标签: 爬虫, json, 数据结构与算法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

常见问题(FAQ)

Scrapy相BeautifulSoup或lxml比较,如何呢?

BeautifulSoup 及 lxml 是HTML和XML的分析库。Scrapy则是 编写爬虫,爬取网页并获取数据的应用框架(application framework)。

Scrapy提供了内置的机制来提取数据(叫做 选择器(selectors))。 但如果您觉得使用更为方便,也可以使用 BeautifulSoup (或 lxml)。 总之,它们仅仅是分析库,可以在任何Python代码中被导入及使用。

换句话说,拿Scrapy与 BeautifulSoup (或 lxml) 比较就好像是拿 jinja2 与 Django 相比。

Scrapy支持那些Python版本?

Scrapy仅仅支持Python 2.7。 Python2.6的支持从Scrapy 0.20开始被废弃了。

Scrapy支持Python 3么?

不。但是Python 3.3+的支持已经在计划中了。 现在,Scrapy支持Python 2.7。

参见

Scrapy支持那些Python版本?.

Scrapy是否从Django中”剽窃”了X呢?

也许吧,不过我们不喜欢这个词。我们认为 Django 是一个很好的开源项目,同时也是 一个很好的参考对象,所以我们把其作为Scrapy的启发对象。

我们坚信,如果有些事情已经做得很好了,那就没必要再重复制造轮子。这个想法,作为 开源项目及免费软件的基石之一,不仅仅针对软件,也包括文档,过程,政策等等。 所以,与其自行解决每个问题,我们选择从其他已经很好地解决问题的项目中复制想法(copy idea) ,并把注意力放在真正需要解决的问题上。

如果Scrapy能启发其他的项目,我们将为此而自豪。欢迎来抄(steal)我们!

Scrapy支持HTTP代理么?

是的。(从Scrapy 0.8开始)通过HTTP代理下载中间件对HTTP代理提供了支持。参考HttpProxyMiddleware.

如何爬取属性在不同页面的item呢?

参考 Passing additional data to callback functions.

Scrapy退出,ImportError: Nomodule named win32api

这是个Twisted bug ,您需要安装 pywin32 。

我要如何在spider里模拟用户登录呢?

参考 使用FormRequest.from_response()方法模拟用户登录.

Scrapy是以广度优先还是深度优先进行爬取的呢?

默认情况下,Scrapy使用 LIFO 队列来存储等待的请求。简单的说,就是 深度优先顺序 。深度优先对大多数情况下是更方便的。如果您想以 广度优先顺序 进行爬取,你可以设置以下的设定:

DEPTH_PRIORITY = 1SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

我的Scrapy爬虫有内存泄露,怎么办?

参考 调试内存溢出.

另外,Python自己也有内存泄露,在 Leaks without leaks 有所描述。

如何让Scrapy减少内存消耗?

参考上一个问题

我能在spider中使用基本HTTP认证么?

可以。参考 HttpAuthMiddleware.

为什么Scrapy下载了英文的页面,而不是我的本国语言?

尝试通过覆盖 DEFAULT_REQUEST_HEADERS 设置来修改默认的 Accept-Language 请求头。

我能在哪里找到Scrapy项目的例子?

参考 例子.

我能在不创建Scrapy项目的情况下运行一个爬虫(spider)么?

是的。您可以使用 runspider 命令。例如,如果您有个 spider写在 my_spider.py 文件中,您可以运行:

scrapy runspider my_spider.py

详情请参考 runspider 命令。

我收到了 “Filtered offsite request” 消息。如何修复?

这些消息(以 DEBUG 所记录)并不意味着有问题,所以你可以不修复它们。

这些消息由Offsite Spider中间件(Middleware)所抛出。 该(默认启用的)中间件筛选出了不属于当前spider的站点请求。

更多详情请参见: OffsiteMiddleware.

发布Scrapy爬虫到生产环境的推荐方式?

参见 Scrapyd.

我能对大数据(large exports)使用JSON么?

这取决于您的输出有多大。参考 JsonItemExporter 文档中的 这个警告

我能在信号处理器(signal handler)中返回(Twisted)引用么?

有些信号支持从处理器中返回引用,有些不行。参考 内置信号参考手册(Built-in signals reference)来了解详情。

reponse返回的状态值999代表了什么?

999是雅虎用来控制请求量所定义的返回值。 试着减慢爬取速度,将spider的下载延迟改为 2 或更高:

class MySpider(CrawlSpider):

    name = 'myspider'

    download_delay = 2

    # [ ... rest of the spider code ... ]

或在 DOWNLOAD_DELAY 中设置项目的全局下载延迟。

我能在spider中调用 pdb.set_trace() 来调试么?

可以,但你也可以使用Scrapy终端。这能让你快速分析(甚至修改) spider处理返回的返回(response)。通常来说,比老旧的 pdb.set_trace() 有用多了。

更多详情请参考 在spider中启动shell来查看response.

将所有爬取到的item转存(dump)到JSON/CSV/XML文件的最简单的方法?

dump到JSON文件:

scrapy crawl myspider -o items.json

dump到CSV文件:

scrapy crawl myspider -o items.csv

dump到XML文件:

scrapy crawl myspider -o items.xml

更多详情请参考 Feed exports

在某些表单中巨大神秘的 __VIEWSTATE 参数是什么?

__VIEWSTATE 参数存在于ASP.NET/VB.NET建立的站点中。关于这个参数的作用请参考 这篇文章 。这里有一个爬取这种站点的 样例爬虫 。

分析大XML/CSV数据源的最好方法是?

使用XPath选择器来分析大数据源可能会有问题。选择器需要在内存中对数据建立完整的 DOM树,这过程速度很慢且消耗大量内存。

为了避免一次性读取整个数据源,您可以使用 scrapy.utils.iterators 中的 xmliter 及 csviter 方法。 实际上,这也是feed spider(参考 Spiders)中的处理方法。

Scrapy自动管理cookies么?

是的,Scrapy接收并保持服务器返回来的cookies,在之后的请求会发送回去,就像正常的网页浏览器做的那样。

更多详情请参考 Requests and Responses 及 CookiesMiddleware 。

如何才能看到Scrapy发出及接收到的Scrapy呢?

启用 COOKIES_DEBUG 选项。

要怎么停止爬虫呢?

在回调函数中raise CloseSpider 异常。 更多详情请参见: CloseSpider 。

如何避免我的Scrapy机器人(bot)被禁止(ban)呢?

参考 避免被禁止(ban).

我应该使用spider参数(arguments)还是设置(settings)来配置spider呢?

spider参数 及 设置(settings) 都可以用来配置您的spider。 没有什么强制的规则来限定要使用哪个,但设置(settings)更适合那些一旦设置就不怎么会修改的参数, 而spider参数则意味着修改更为频繁,在每次spider运行都有修改,甚至是spider运行所必须的元素 (例如,设置spider的起始url)。

这里以例子来说明这个问题。假设您有一个spider需要登录某个网站来 爬取数据,并且仅仅想爬取特定网站的特定部分(每次都不一定相同)。 在这个情况下,认证的信息将写在设置中,而爬取的特定部分的url将是spider参数。

我爬取了一个XML文档但是XPath选择器不返回任何的item

也许您需要移除命名空间(namespace)。参见 移除命名空间.

我得到错误: “不能导入name crawler“

这是由于Scrapy修改,去掉了单例模式(singletons)所引起的。 这个错误一般是由从 scrapy.project导入 crawler 的模块引起的(扩展,中间件,pipeline或spider)。 例如:

from scrapy.project import crawlerclass SomeExtension(object):
    def __init__(self):
        self.crawler = crawler
        # ...

这种访问crawler对象的方式已经被舍弃了,新的代码应该使用 from_crawler 类方法来移植,例如:

class SomeExtension(object):

    @classmethod
    def from_crawler(cls, crawler):
        o = cls()
        o.crawler = crawler
        return o

Scrapy终端工具(command line tool)针对旧的导入机制提供了一些支持(给出了废弃警告), 但如果您以不同方式使用Scrapy(例如,作为类库),该机制可能会失效。


转载于:https://my.oschina.net/airship/blog/529400


http://www.niftyadmin.cn/n/710305.html

相关文章

自动生成公钥并自动写入到特定服务器脚本

自动生成公钥并自动写入到特定服务器脚本 普遍账号需开的sudo权限 zhi.yang ALL(ALL:ALL)NOPASSWD:/usr/bin/tee -a /root/.ssh/authorized_keys,/bin/mkdir /log/* # expect/usr/local/bin/sshkey.exp 10.0.0.3 shaa01 zhi.yang xxxxx #!/usr/bin/expect set ip [lindex $ar…

ssh密钥认证原理

SSH之所以能够保证安全,原因在于它采用了公钥加密。整个ssh密码登录过程是这样的:1)用户向远程主机发登录请求:ssh user远程主机2)远程主机收到用户的登录请求,把自己的公钥发给用户。2)用户使用…

NOJ:求建筑高度

问题先放在这&#xff0c;可能是数据类型&#xff1f;&#xff1f;的锅。 distance应该是1&#xff0c;但是代码如下才会输出正确结果。 #include <stdio.h> #include <math.h> #include <stdlib.h> int main() {double a,b,x,y,m,n;double distance;scanf(…

Gitlab自动触发Jenkins构建打包

一、目的 在部门的测试环境中&#xff0c;开发人员一旦向gitlab仓库提交成功代码&#xff0c;gitlab就会自动触发jenkins构建项目。当然在构建后还可以添加项目部署或者自动化测试的脚本。这里只针对测试环境。 二、Jenkins配置 2.1 安装Gitlab Hook Plugin插件&#xff1a; 系…

NOJ:计算Π

#include <stdio.h> #include <math.h> #include <stdlib.h> int main() {double a,low;int i;double x,y,ans;alow1.0;x1;while(fabs(a/low)>0.0000001){a-a;lowlow2;xxa/low;}ans 4.0*x;printf("%.6lf\n",ans);return 0; }

如何做一个开心的程序员

如何做一个开心的程序员 经常有人发帖讨论怎么做一个成功的程序员,如何才能成为一个优秀的程序员,我并不太同意这些文章中的看法&#xff0c;想在这里我想提出一些我对于程序员这个职业自己的想法。 和标题中写的一样&#xff0c;我的目标不是成为一个优秀或者成功的程序员&…

[体感游戏]关于体感游戏的一些思考(六)--- 飞行

不同文化的古老梦想中都包含了飞行。人类总是抬头妒忌地看着鸟儿飞越天空。我们学会了制造机器来帮助自己弥补没有翅膀或者力量不够的缺点&#xff0c;但是把自己放进铁盒子里面也意味着我们失去了一直渴望的自由飞行体验。而当我们尝试要回它的时候&#xff0c;这种体验已经变…

NOJ:自然数立方的乐趣

硬做解不出来&#xff0c;但我看不懂为什么外层的for不循环。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {int x;scanf("%d",&x);int ans,result;ansx*x*x;printf("%d*%d*%d%d",x,x,x,ans);int i,j,a[…