【问题标题】:Recursively crawl a webpage using authentication with scrapy使用带有scrapy的身份验证递归地抓取网页
【发布时间】:2014-04-01 21:18:06
【问题描述】:

我正在尝试抓取需要身份验证的网页。

我面临的问题是,第一次登录工作正常,我得到了成功登录的日志,但是当爬虫从 start_url 开始爬取页面时,它不会捕获 csv 文件中的页面需要登录凭据才能查看数据的输出。

我是否遗漏了在整个过程中保留登录会话的任何内容,或者进行一些检查以检查每个需要登录的 url,然后才继续。

我的登录表单是一个帖子表单,输出如下 -

2014-02-28 21:16:53+0000 [myspider] 信息:爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)

2014-02-28 21:16:53+0000 [scrapy] 调试:Telnet 控制台正在监听 0.0.0.0:6023

2014-02-28 21:16:53+0000 [scrapy] 调试:Web 服务正在侦听 0.0.0.0:6080

2014-02-28 21:16:53+0000 [myspider] 调试:已爬网 (200) https://someurl.com/login_form>(引用者:无)

2014-02-28 21:16:53+0000 [myspider] 调试:已爬网 (200) https://someurl.com/search>(引用者:https://someurl.com/login_form

2014-02-28 21:16:53+0000 [myspider] DEBUG:登录成功,开始爬取!

它会在第一次点击时自动进入搜索页面,而不是 login_form 页面 (start_url)

请有人帮我解决这个问题?

下面是我的代码:

from scrapy.spider import BaseSpider
from scrapy.contrib.spiders.init import InitSpider
from scrapy.http import Request, FormRequest
from scrapy.selector import HtmlXPathSelector
from tutorial.items import DmozItem
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import urlparse
from scrapy import log


class MySpider(CrawlSpider):

        name = 'myspider'
        allowed_domains = ['someurl.com']
        login_page = 'https://someurl.com/login_form'
        start_urls = 'https://someurl.com/'

        rules = [Rule(SgmlLinkExtractor(), follow=True, callback='parse_item')]

        def start_requests(self):

            yield Request(
                url=self.login_page,
                callback=self.login,
                dont_filter=True
            )


        def login(self, response):
            """Generate a login request."""
            return FormRequest.from_response(response,
                    formdata={'__ac_name': 'username', '__ac_password': 'password' },
                    callback=self.check_login_response)


        def check_login_response(self, response):
            if "Sign Out" in response.body:
                self.log("Successfully logged in. Start Crawling")
                return Request(url=self.start_urls)
            else:
                self.log("Not Logged in")


        def parse_item(self, response):

            # Scrape data from page
            items = []
            failed_urls = []
            hxs = HtmlXPathSelector(response)

            urls = hxs.select('//base/@href').extract()
            urls.extend(hxs.select('//link/@href').extract())
            urls.extend(hxs.select('//a/@href').extract())
            urls = list(set(urls))

            for url in urls :

                item = DmozItem()

                if response.status == 404:
                    failed_urls.append(response.url)
                    self.log('failed_url : %s' % failed_urls)
                    item['failed_urls'] = failed_urls
                else :

                    if url.startswith('http') :
                        if url.startswith('https://someurl.com'):
                            item['internal_link'] = url
                            self.log('internal_link : %s ' % url)
                        else :
                            item['external_link'] = url
                            self.log('external_link : %s ' % url)

                items.append(item)

            items = list(set(items))
            return items

【问题讨论】:

    标签: python forms-authentication web-crawler scrapy


    【解决方案1】:

    您可以使用 FormRequest 函数通过 Scrapy 进行身份验证,如下所示:

    scrapy.FormRequest(
            self.start_urls[0],
            formdata={'LoginForm[username]':username_scrapy, 'LoginForm[password]':password_scrapy,'yt0': 'Login'},
            headers=self.headers)
    

    LoginForm[username]、LoginForm[password]是通过登录FORM传递的变量

    【讨论】:

      【解决方案2】:

      您需要一个无头浏览器,而不仅仅是一个抓取工具。尝试使用 scrapyjs (https://github.com/scrapinghub/scrapyjs) 或 selenium 扩展 scrapy。

      【讨论】:

      • 这个scrapyjs到底是做什么用的?
      猜你喜欢
      • 2014-09-15
      • 2014-08-16
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多