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

使用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能做那种爬行吗?怎么做的?

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

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

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

  • 我有一个Spring Boot服务,我们有项目、贡献者以及项目和贡献者之间的多对多关系,这在JPA中被建模为3个独立的实体,项目、贡献者和项目贡献者。我正在使用Spring数据与Postgres中的DB进行交互。 在SQS的事件消耗之后,有时我们必须在DB中创建数千个项目及其贡献者。这些项目和贡献者由一些外部服务提供。 在我们必须创建1000个项目的场景中,每个项目平均有2个贡献者,我通过每个实体

  • 注解 本教程所使用的样例站Google Directory已经 被Google关闭 了。不过教程中的概念任然适用。 如果您打算使用一个新的网站来更新本教程,您的贡献是再欢迎不过了。 详细信息请参考 Contributing to Scrapy 。 介绍 本文档介绍了如何适用 Firebug (一个Firefox的插件)来使得爬取更为简单,有趣。 更多有意思的Firefox插件请参考 对爬取有帮助的

  • 本文向大家介绍使用PyV8在Python爬虫中执行js代码,包括了使用PyV8在Python爬虫中执行js代码的使用技巧和注意事项,需要的朋友参考一下 前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要么ajax基础烂,反正各方面都很烂。基础这么渣不