当前位置: 首页 > 面试题库 >

使用PostBack数据在页面中爬行javascript Python Scrapy

林亦
2023-03-14
问题内容

我正在通过Scrapy使用ASP.NET编程来浏览某些目录。

要爬网的页面编码如下:

javascript:__doPostBack('ctl00$MainContent$List','Page$X')

其中X是1到180之间的整数。MainContent参数始终相同。我不知道如何爬进这些。我希望可以像allow=('Page$')或一样简单地向SLE规则中添加一些内容attrs='__doPostBack',但是我想我必须更加棘手才能从javascript“链接”中提取信息。

如果更容易从JavaScript代码中“取消屏蔽”每个绝对链接并将其保存到csv,则可以使用该csv将请求加载到新的抓取工具中,也可以。


问题答案:

这种分页并不是看起来那么简单。解决它是一个有趣的挑战。以下是有关该解决方案的一些重要说明:

  • 这里的想法是按照分页页面逐页在字典中的当前页面周围传递Request.meta
  • 使用常规,BaseSpider因为分页涉及一些逻辑
  • headers假装成为真正的浏览器很重要
  • 产生FormRequests很重要,dont_filter=True因为我们基本上是POST向相同的URL发出请求,但参数不同

编码:

import re

from scrapy.http import FormRequest
from scrapy.spider import BaseSpider


HEADERS = {
    'X-MicrosoftAjax': 'Delta=true',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36'
}
URL = 'http://exitrealty.com/agent_list.aspx?firstName=&lastName=&country=USA&state=NY'


class ExitRealtySpider(BaseSpider):
    name = "exit_realty"

    allowed_domains = ["exitrealty.com"]
    start_urls = [URL]

    def parse(self, response):
        # submit a form (first page)
        self.data = {}
        for form_input in response.css('form#aspnetForm input'):
            name = form_input.xpath('@name').extract()[0]
            try:
                value = form_input.xpath('@value').extract()[0]
            except IndexError:
                value = ""
            self.data[name] = value

        self.data['ctl00$MainContent$ScriptManager1'] = 'ctl00$MainContent$UpdatePanel1|ctl00$MainContent$agentList'
        self.data['__EVENTTARGET'] = 'ctl00$MainContent$List'
        self.data['__EVENTARGUMENT'] = 'Page$1'

        return FormRequest(url=URL,
                           method='POST',
                           callback=self.parse_page,
                           formdata=self.data,
                           meta={'page': 1},
                           dont_filter=True,
                           headers=HEADERS)

    def parse_page(self, response):
        current_page = response.meta['page'] + 1

        # parse agents (TODO: yield items instead of printing)
        for agent in response.xpath('//a[@class="regtext"]/text()'):
            print agent.extract()
        print "------"

        # request the next page
        data = {
            '__EVENTARGUMENT': 'Page$%d' % current_page,
            '__EVENTVALIDATION': re.search(r"__EVENTVALIDATION\|(.*?)\|", response.body, re.MULTILINE).group(1),
            '__VIEWSTATE': re.search(r"__VIEWSTATE\|(.*?)\|", response.body, re.MULTILINE).group(1),
            '__ASYNCPOST': 'true',
            '__EVENTTARGET': 'ctl00$MainContent$agentList',
            'ctl00$MainContent$ScriptManager1': 'ctl00$MainContent$UpdatePanel1|ctl00$MainContent$agentList',
            '': ''
        }

        return FormRequest(url=URL,
                           method='POST',
                           formdata=data,
                           callback=self.parse_page,
                           meta={'page': current_page},
                           dont_filter=True,
                           headers=HEADERS)


 类似资料:
  • 本文向大家介绍python爬虫爬取网页数据并解析数据,包括了python爬虫爬取网页数据并解析数据的使用技巧和注意事项,需要的朋友参考一下 1.网络爬虫的基本概念 网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。 只要浏览器能够做的事情,原则上,爬虫都能够做到。 2.网络爬虫的功能 网络爬虫可以代替手工做很多事情,比如可以

  • 我看到了一些像http://homes.mitula.ph/homes/makati这样的搜索网站,我想知道他们是如何抓取其他网站(如、和)中的数据并将其显示到他们的站点上的。 我正在考虑使用Solr索引数据,使用Nutch抓取数据。我是一个新的网页抓取和索引,目前为止,我只能抓取一个网页的内容。 Solr Nutch能做那种爬行吗?怎么做的?

  • 问题内容: 我是新手。我正在使用获取对象列表并将其显示在第一页上的服务。然后根据单击的对象,在下一页上设置选项卡标题。但是,当我刷新页面时,列表的范围丢失了,并且选项卡头引发了异常,导致页面无法显示信息。即使刷新第二页,是否可以保留上一个屏幕上单击了哪个对象的信息? 问题答案: 您可以使用角度本地存储 角度本地存储 示例如何使用它: 使用本地存储的示例

  • 问题内容: 是否可以在JSP页面上使用,然后在HTML Submit上使用在中获得相同的请求属性? 问题答案: 不能。不幸的是,Request对象仅在页面加载完成之前才可用-一旦完成,您将丢失其中的所有值,除非它们存储在某个位置。 如果要通过请求保留属性,则需要: 在表单中有一个隐藏的输入,例如。然后,它将在servlet中作为请求参数提供。 将其放在会话中(请参阅-在JSP 中,它很容易使用)

  • 问题内容: 我正在尝试在应用程序的结帐过程中在页面之间传递数据,但是它无法正常工作。我已经读了一些书,大多数人建议使用服务,但是唯一的问题是,刷新页面(用户单击刷新或稍后再返回)时,该服务中的所有数据都会消失。这是有道理的,因为服务中的数据并不是永久性的,而是会引起问题。 所以问题是:如何在angularJS中的页面之间传递数据,并且仍然保持页面刷新后传递的数据? 到目前为止,这是我的代码(尝试使

  • 我在看一些旧代码,我试图重写它,但我遇到了一个问题。 这是运行良好的旧代码: 但是我使用的是Spring Data 2,其中的页面映射方法采用了一个函数而不是一个转换器,所以我不知道如何重写这个。 我读了这个主题:如何映射页面 有人能用SpringData2方法(Function而不是Converter)翻译上面的代码片段吗?

  • 我必须在ajax请求后动态呈现一个表,并希望按配置名称对行进行分组。在数据表中使用rowspan时,仅呈现简单表,并且存在控制台错误: jquery。数据表。min.js:24未捕获的TypeError:无法设置未定义的属性“\u DT\u CellIndex” 我使用handlebars.js填充表模板 日期:https://cdn.datatables.net/1.10.19/js/jquer

  • 我在使用测试时遇到空指针异常。将()方法记录到页面对象中。 我的扩展报告测试在TestBase类的“@Beforemethod”中定义。因此,我需要访问test.log();进入Page Object例如。LoginPage.java.它在测试用例级别运行良好,即。LoginPageTest.java 下面是登录页面。java(这是一个页面对象类) 正如您在LoginPage类中看到的,我使用了T