BeautifulSoup 及 lxml 是HTML和XML的分析库。Scrapy则是 编写爬虫,爬取网页并获取数据的应用框架(application framework)。html
Scrapy提供了内置的机制来提取数据(叫作 选择器(selectors))。 但若是您以为使用更为方便,也可使用 BeautifulSoup (或 lxml)。 总之,它们仅仅是分析库,能够在任何Python代码中被导入及使用。python
换句话说,拿Scrapy与 BeautifulSoup (或 lxml) 比较就好像是拿 jinja2 与 Django 相比。git
Scrapy仅仅支持Python 2.7。 Python2.6的支持从Scrapy 0.20开始被废弃了。github
不。可是Python 3.3+的支持已经在计划中了。 如今,Scrapy支持Python 2.7。web
参见shell
Scrapy支持那些Python版本?.django
也许吧,不过咱们不喜欢这个词。咱们认为 Django 是一个很好的开源项目,同时也是 一个很好的参考对象,因此咱们把其做为Scrapy的启发对象。json
咱们坚信,若是有些事情已经作得很好了,那就不必再重复制造轮子。这个想法,做为 开源项目及免费软件的基石之一,不只仅针对软件,也包括文档,过程,政策等等。 因此,与其自行解决每一个问题,咱们选择从其余已经很好地解决问题的项目中复制想法(copy idea) ,并把注意力放在真正须要解决的问题上。api
若是Scrapy能启发其余的项目,咱们将为此而自豪。欢迎来抄(steal)咱们!浏览器
是的。(从Scrapy 0.8开始)经过HTTP代理下载中间件对HTTP代理提供了支持。参考HttpProxyMiddleware
.
参考 Passing additional data to callback functions.
这是个Twisted bug ,您须要安装 pywin32 。
参考 使用FormRequest.from_response()方法模拟用户登陆.
默认状况下,Scrapy使用 LIFO 队列来存储等待的请求。简单的说,就是 深度优先顺序 。深度优先对大多数状况下是更方便的。若是您想以 广度优先顺序 进行爬取,你能够设置如下的设定:
DEPTH_PRIORITY = 1SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
参考 调试内存溢出.
另外,Python本身也有内存泄露,在 Leaks without leaks 有所描述。
参考上一个问题
能够。参考 HttpAuthMiddleware
.
尝试经过覆盖 DEFAULT_REQUEST_HEADERS
设置来修改默认的 Accept-Language 请求头。
参考 例子.
是的。您可使用 runspider
命令。例如,若是您有个 spider写在 my_spider.py
文件中,您能够运行:
scrapy runspider my_spider.py
详情请参考 runspider
命令。
这些消息(以 DEBUG
所记录)并不意味着有问题,因此你能够不修复它们。
这些消息由Offsite Spider中间件(Middleware)所抛出。 该(默认启用的)中间件筛选出了不属于当前spider的站点请求。
更多详情请参见: OffsiteMiddleware
.
参见 Scrapyd.
这取决于您的输出有多大。参考 JsonItemExporter
文档中的 这个警告
有些信号支持从处理器中返回引用,有些不行。参考 内置信号参考手册(Built-in signals reference)来了解详情。
999是雅虎用来控制请求量所定义的返回值。 试着减慢爬取速度,将spider的下载延迟改成 2
或更高:
class MySpider(CrawlSpider): name = 'myspider' download_delay = 2 # [ ... rest of the spider code ... ]
或在 DOWNLOAD_DELAY
中设置项目的全局下载延迟。
pdb.set_trace()
来调试么?能够,但你也可使用Scrapy终端。这能让你快速分析(甚至修改) spider处理返回的返回(response)。一般来讲,比老旧的 pdb.set_trace()
有用多了。
更多详情请参考 在spider中启动shell来查看response.
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创建的站点中。关于这个参数的做用请参考 这篇文章 。这里有一个爬取这种站点的 样例爬虫 。
使用XPath选择器来分析大数据源可能会有问题。选择器须要在内存中对数据创建完整的 DOM树,这过程速度很慢且消耗大量内存。
为了不一次性读取整个数据源,您可使用 scrapy.utils.iterators
中的 xmliter
及 csviter
方法。 实际上,这也是feed spider(参考 Spiders)中的处理方法。
是的,Scrapy接收并保持服务器返回来的cookies,在以后的请求会发送回去,就像正常的网页浏览器作的那样。
更多详情请参考 Requests and Responses 及 CookiesMiddleware 。
启用 COOKIES_DEBUG
选项。
在回调函数中raise CloseSpider
异常。 更多详情请参见: CloseSpider
。
参考 避免被禁止(ban).
spider参数 及 设置(settings) 均可以用来配置您的spider。 没有什么强制的规则来限定要使用哪一个,但设置(settings)更适合那些一旦设置就不怎么会修改的参数, 而spider参数则意味着修改更为频繁,在每次spider运行都有修改,甚至是spider运行所必须的元素 (例如,设置spider的起始url)。
这里以例子来讲明这个问题。假设您有一个spider须要登陆某个网站来 爬取数据,而且仅仅想爬取特定网站的特定部分(每次都不必定相同)。 在这个状况下,认证的信息将写在设置中,而爬取的特定部分的url将是spider参数。
也许您须要移除命名空间(namespace)。参见 移除命名空间.
这是因为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(例如,做为类库),该机制可能会失效。