在Scrapy文档中,有以下示例说明如何在Scrapy中使用经过身份验证的会话:
class LoginSpider(BaseSpider):
name = 'example.com'
start_urls = ['http://www.example.com/users/login.php']
def parse(self, response):
return [FormRequest.from_response(response,
formdata={'username': 'john', 'password': 'secret'},
callback=self.after_login)]
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.log("Login failed", level=log.ERROR)
return
# continue scraping with authenticated session...
Run Code Online (Sandbox Code Playgroud)
我有那个工作,没关系.但我的问题是:continue scraping with authenticated session正如他们在最后一行的评论中所说,你需要做什么?
我想在Scrapy(屏幕抓取器/网络爬虫)中实现一些单元测试.由于项目是通过"scrapy crawl"命令运行的,我可以通过像nose这样的东西运行它.由于scrapy是建立在扭曲的基础之上,我可以使用它的单元测试框架试用吗?如果是这样,怎么样?否则,我想获得的鼻子工作.
更新:
我一直在谈论Scrapy-Users,我想我应该"在测试代码中构建Response,然后使用响应调用该方法并声明[I]在输出中获得预期的项目/请求".我似乎无法让这个工作.
我可以构建一个单元测试测试类并进行测试:
然而,它最终会产生这种追溯.任何洞察力为什么?
我是Scrapy的新手,我正在寻找一种从Python脚本运行它的方法.我找到了两个解释这个的来源:
http://tryolabs.com/Blog/2011/09/27/calling-scrapy-python-script/
http://snipplr.com/view/67006/using-scrapy-from-a-script/
我无法弄清楚我应该在哪里放置我的蜘蛛代码以及如何从主函数中调用它.请帮忙.这是示例代码:
# This snippet can be used to run scrapy spiders independent of scrapyd or the scrapy command line tool and use it from a script.
#
# The multiprocessing library is used in order to work around a bug in Twisted, in which you cannot restart an already running reactor or in this case a scrapy instance.
#
# [Here](http://groups.google.com/group/scrapy-users/browse_thread/thread/f332fc5b749d401a) is the mailing-list discussion for this snippet.
#!/usr/bin/python
import os
os.environ.setdefault('SCRAPY_SETTINGS_MODULE', 'project.settings') #Must be at the …Run Code Online (Sandbox Code Playgroud) 关于cookies如何与Scrapy一起工作,以及如何管理这些cookie,我有点困惑.
这基本上是我正在尝试做的简化版本:

当您访问该网站时,您将获得一个会话cookie.
当您进行搜索时,网站会记住您搜索的内容,因此当您执行类似于进入下一页结果的操作时,它会知道它正在处理的搜索.
我的蜘蛛有一个searchpage_url的起始网址
请求parse()搜索页面,并将搜索表单响应传递给search_generator()
search_generator()那么yield很多搜索请求使用FormRequest和搜索表单响应.
每个FormRequests和后续子请求都需要拥有自己的会话,因此需要拥有自己的cookiejar和自己的会话cookie.
我已经看到了文档的一部分,它讨论了一个阻止cookie被合并的元选项.这究竟意味着什么?是否意味着提出请求的蜘蛛将在其余生中拥有自己的cookiejar?
如果cookie是按蜘蛛级别进行的,那么当生成多个蜘蛛时它是如何工作的?是否有可能只使第一个请求生成器产生新的蜘蛛,并确保从那时起只有该蜘蛛处理未来的请求?
我假设我必须禁用多个并发请求..否则一个蜘蛛会在同一会话cookie下进行多次搜索,未来的请求只会涉及最近的搜索?
我很困惑,任何澄清都会受到极大的欢迎!
我刚才想到的另一个选择是完全手动管理会话cookie,并将其从一个请求传递到另一个请求.
我想这意味着禁用cookie ..然后从搜索响应中获取会话cookie,并将其传递给每个后续请求.
这是你在这种情况下应该做的吗?
考虑一下这种情况,我想经常抓取网站,但是我的IP地址在某天/限制后被阻止了.
那么,如何动态更改我的IP地址或任何其他想法?
在抓取像https://www.netflix.com这样的网站时,通过robots.txt获取禁止:https://www.netflix.com/>
错误:未下载响应:https://www.netflix.com/
我有item对象,我需要将它传递到许多页面以将数据存储在单个项目中
喜欢我的项目
class DmozItem(Item):
title = Field()
description1 = Field()
description2 = Field()
description3 = Field()
Run Code Online (Sandbox Code Playgroud)
现在这三个描述分为三个单独的页面.我想做些喜欢的事
现在这很适合 parseDescription1
def page_parser(self, response):
sites = hxs.select('//div[@class="row"]')
items = []
request = Request("http://www.example.com/lin1.cpp", callback =self.parseDescription1)
request.meta['item'] = item
return request
def parseDescription1(self,response):
item = response.meta['item']
item['desc1'] = "test"
return item
Run Code Online (Sandbox Code Playgroud)
但我想要类似的东西
def page_parser(self, response):
sites = hxs.select('//div[@class="row"]')
items = []
request = Request("http://www.example.com/lin1.cpp", callback =self.parseDescription1)
request.meta['item'] = item
request = Request("http://www.example.com/lin1.cpp", callback =self.parseDescription2)
request.meta['item'] = item
request = Request("http://www.example.com/lin1.cpp", callback …Run Code Online (Sandbox Code Playgroud) 有没有办法在Spider类终止之前触发它?
我可以自己终止蜘蛛,像这样:
class MySpider(CrawlSpider):
#Config stuff goes here...
def quit(self):
#Do some stuff...
raise CloseSpider('MySpider is quitting now.')
def my_parser(self, response):
if termination_condition:
self.quit()
#Parsing stuff goes here...
Run Code Online (Sandbox Code Playgroud)
但我找不到任何关于如何确定蜘蛛何时会自然戒烟的信息.
scrapy ×10
python ×8
web-crawler ×3
web-scraping ×2
cookies ×1
dynamic-ip ×1
ip ×1
nose ×1
session ×1
unit-testing ×1