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

Xodarap777

我正在通过Scrapy使用ASP.NET编程在某些目录中进行爬网。

要爬网的页面编码如下:

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

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

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

ec

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

  • 这里的想法是按照分页页面逐页在字典中的当前页面周围传递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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用SCRAPY和PYTHON从Javascript抓取数据

来自分类Dev

Python,在Scrapy中传递数据

来自分类Dev

使用python爬行页面

来自分类Dev

python scrapy从网站提取数据

来自分类Dev

python scrapy从网站提取数据

来自分类Dev

在python scrapy中处理分页

来自分类Dev

在python scrapy中处理分页

来自分类Dev

在 python scrapy 中获取文本

来自分类Dev

在python中使用scrapy的LinkExtractor

来自分类Dev

如何使用python Scrapy抓取Factiva数据?

来自分类Dev

如何使用python遍历scrapy中的节点

来自分类Dev

Scrapy,使用Python 3.4在终端中失败

来自分类Dev

如何使用scrapy在Python中抓取网址

来自分类Dev

使用scrapy和FormRequest爬行所有页面

来自分类Dev

Python Scrapy,从子页面返回进行抓取

来自分类Dev

Python + scrapy + 网页抓取:页面未被抓取

来自分类Dev

Python-Scrapy无法获取数据

来自分类Dev

从抓取的数据创建嵌套字典(Scrapy Python)

来自分类Dev

Python包含子目录中的Scrapy

来自分类Dev

删除scrapy python中的特殊字符

来自分类Dev

无法在python scrapy中运行扩展

来自分类Dev

在python 3.5中安装scrapy时出错

来自分类Dev

在div标签Python Scrapy中获取HTML

来自分类Dev

删除scrapy python中的特殊字符

来自分类Dev

避免 python/scrapy 中的冗余代码

来自分类Dev

Python Scrapy:在“href”中查找文本

来自分类Dev

从python脚本中运行scrapy程序

来自分类Dev

使用Python Scrapy时的HTTP 403响应

来自分类Dev

使用python-Scrapy抓取动态内容