【问题标题】:Scrapy Spider authenticate and iterateScrapy Spider 身份验证和迭代
【发布时间】:2013-11-08 21:14:08
【问题描述】:

下面是我整理的一个 Scrapy 蜘蛛,用于从网页中提取一些元素。我从another Stack Overflow solution 借用了这个解决方案。它有效,但我需要更多。验证后,我需要能够在 start_requests 方法内的 for 循环中指定的一系列页面。

是的,我确实找到了 Scrapy documentation discussing this 以及之前针对 something very similar 的解决方案。两者似乎都没有多大意义。据我所知,我需要以某种方式创建一个请求对象并继续传递它,但似乎无法弄清楚如何做到这一点。

提前感谢您的帮助。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
import re

class MyBasicSpider(BaseSpider):
    name = "awBasic"
    allowed_domains = ["americanwhitewater.org"]

    def start_requests(self):
        '''
        Override BaseSpider.start_requests to crawl all reaches in series
        '''
        # for every integer from one to 5000
        for i in xrange(1, 50): # 1 to 50 for testing

            # convert to string
            iStr = str(i)

            # add leading zeros to get to four digit length
            while len(iStr) < 4:
                iStr = '0{0}'.format(iStr)

            # call make requests
            yield self.make_requests_from_url('https://mycrawlsite.com/{0}/'.format(iStr))

    def parse(self, response):

        # create xpath selector object instance with response
        hxs = HtmlXPathSelector(response)

        # get part of url string
        url = response.url
        id = re.findall('/(\d{4})/', url)[0]

        # selector 01
        attribute01 = hxs.select('//div[@id="block_1"]/text()').re('([^,]*)')[0]

        # selector for river section
        attribute02 = hxs.select('//div[@id="block_1"]/div[1]/text()').extract()[0]

        # print results
        print('\tID: {0}\n\tAttr01: {1}\n\tAttr02: {2}').format(reachId, river, reachName) 

【问题讨论】:

    标签: python authentication scrapy


    【解决方案1】:

    您可能需要从不同的角度来解决问题:

    • 首先,抓取主页;它包含一个登录表单,因此您可以使用FormRequest 模拟用户登录;您的 parse 方法可能看起来像这样:

      def parse(self, response):
          return [FormRequest.from_response(response,
                      formdata={'username': 'john', 'password': 'secret'},
                      callback=self.after_login)]
      
    • after_login 中,您检查身份验证是否成功,通常通过扫描响应以查找错误消息;如果一切顺利并且您已登录,您可以开始为您所追求的页面生成请求:

      def after_login(self, response):
          if "Login failed" in response.body:
              self.log("Login failed", level=log.ERROR)
          else:
              for i in xrange(1, 50): # 1 to 50 for testing
                  # convert to string
                  iStr = str(i)
      
                  # add leading zeros to get to four digit length
                  while len(iStr) < 4:
                      iStr = '0{0}'.format(iStr)
      
                  # call make requests
                  yield Request(url='https://mycrawlsite.com/{0}/'.format(iStr),
                                callback=self.scrape_page)
      
    • scrape_page 将与您创建请求的每个页面一起调用;在那里,您最终可以使用 XPath、正则表达式等提取所需的信息。

    顺便说一句,您不应该手动填充数字 0;如果您使用正确的格式说明符,format 将为您完成。

    【讨论】:

    • 非常感谢您的帮助。它需要一些修补才能将它全部连接起来并正常工作,但现在它正在平稳地嗡嗡作响。唯一真正缺少的组件是需要在顶部重新添加开始 url 并为 RequestFormRequest 导入语句。这可能很明显,但我花了几分钟才弄清楚。另外,感谢您使用format 的提示。很快就找到了使用的文档和示例。
    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 2021-06-07
    • 2020-09-19
    • 2015-02-02
    • 2018-02-24
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    相关资源
    最近更新 更多