在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
正如他们在最后一行的评论中所说,你需要做什么?
Aco*_*orn 67
在上面的代码中,FormRequest
用于进行身份验证的代码将after_login
函数设置为其回调.这意味着将调用after_login函数并将登录尝试获得的页面作为响应传递.
然后,在这种情况下,通过在页面中搜索特定字符串来检查您是否已成功登录after_login
.如果它找到了,蜘蛛就会结束.
现在,一旦蜘蛛到目前为止,它知道它已成功通过身份验证,您可以开始生成新请求和/或抓取数据.所以,在这种情况下:
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
# ...
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
# We've successfully authenticated, let's have some fun!
else:
return Request(url="http://www.example.com/tastypage/",
callback=self.parse_tastypage)
def parse_tastypage(self, response):
hxs = HtmlXPathSelector(response)
yum = hxs.select('//img')
# etc.
Run Code Online (Sandbox Code Playgroud)
...
def parse(self, response):
hxs = HtmlXPathSelector(response)
if hxs.select("//form[@id='UsernameLoginForm_LoginForm']"):
return self.login(response)
else:
return self.get_section_links(response)
Run Code Online (Sandbox Code Playgroud)
如果你看这里,有一个蜘蛛的例子在刮之前进行验证.
在这种情况下,它处理"authentication failed"
函数中的内容(任何请求的默认回调).
def parse_page(self, response):
""" Scrape useful stuff from page, and spawn new requests
"""
hxs = HtmlXPathSelector(response)
images = hxs.select('//img')
# .. do something with them
links = hxs.select('//a/@href')
# Yield a new request for each link we found
for link in links:
yield Request(url=link, callback=self.parse_page)
Run Code Online (Sandbox Code Playgroud)
因此,无论何时发出请求,都会检查响应是否存在登录表单.如果它在那里,那么我们知道我们需要登录,所以我们调用相关的函数,如果它不存在,我们调用可以用来从响应中抓取数据的函数.
我希望这很清楚,随时问你是否有任何其他问题!
编辑:
好的,所以你想做的不仅仅是产生一个请求并刮掉它.你想要关注链接.
要做到这一点,您需要做的就是从页面中抓取相关链接,并使用这些URL生成请求.例如:
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
# ...
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
# We've successfully authenticated, let's have some fun!
else:
return Request(url="http://www.example.com/tastypage/",
callback=self.parse_tastypage)
def parse_tastypage(self, response):
hxs = HtmlXPathSelector(response)
yum = hxs.select('//img')
# etc.
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它会为页面上的每个url生成一个新请求,并且每个请求都将使用它们的响应调用此相同的函数,因此我们会进行一些递归的抓取.
我上面写的只是一个例子.如果您想"抓取"页面,则应该查看parse
s而不是手动执行操作.
归档时间: |
|
查看次数: |
57493 次 |
最近记录: |