用scrapy刮一个aspx站点

2024-05-19 07:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着刮下粘贴在下面的网站,并在每个页面上进行迭代,检索每个职位的职位名称和发布的日期。我只能勉强读到第一页。该站点是ASPX,因此需要向服务器发送回发来检索信息。我尝试过用scrapy来模拟这些,但是没有成功。我知道有一些工具可以用来做这件事(比如Selenium),但我希望我能找到一种方法来使用scrapy。这个资源有一些帮助:https://blog.scrapinghub.com/2016/04/20/scrapy-tips-from-the-pros-april-2016-edition 但他们的问题也和我的略有不同,我已经厌倦了用头撞墙了。在

所以到目前为止,我所做的是对刮板如何工作有一个大致的想法:

  1. 刮掉第一页
  2. 找到指向下一页的箭头按钮
  3. 提交一个表单请求,该请求将模拟向页面发送表单以检索下一页的信息
  4. 收集返回的信息
  5. 重复

我最大的问题是,我不太熟悉ASP页面,但我知道,对于每个页面,浏览器都必须进行回发,但我似乎无法以正确的方式提交信息,以便它遍历每一页的信息。在

这是我当前的代码(它已经改变了无数次)。我认识到这不会按原样工作(parse的第二部分显然没有考虑好)。我只是希望这可能是一个好的起点,让别人来看看,并帮助我得到答案。在

import scrapy, re
from ..items import UnionItems

class Union(scrapy.Spider):
    name = "union"
    custom_settings = {
    'ITEM_PIPELINES': {
    'tutorial.pipelines.UnionHospital': 300,
    'tutorial.pipelines.MongoDBPipeline': 300,
    }
#   'DEFAULT_REQUEST_HEADERS': {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#   'Referer': 'https://re21.ultipro.com/UNI1029/JobBoard/ListJobs.aspx?__SVRTRID=05EB3802-DC15-42A8-9843-188F8787D187'


# }
    }

    start_urls = [
    'https://re21.ultipro.com/UNI1029/JobBoard/ListJobs.aspx?__SVRTRID=FFDDC66F-AA37-4484-A868-96DF06DA013C',
    ]


    def parse(self,response):
        items = UnionItems()
        job_title = response.css('.highlightRow:nth-child(3) .LinkSmall , .Cell:nth-child(3) .LinkSmall').css('::text').extract()
        dates_posted = response.css('.highlightRow:nth-child(1) .LinkSmall , .Cell:nth-child(1) .LinkSmall').css('::text').extract()
        items['job_title'] = job_title
        items['date_posted'] = dates_posted
        yield items
        i = 2
        for arrow in response.css('input#__Next::attr(value)').extract_first():
            yield scrapy.FormRequest.from_response(
                response,
                method="POST",
                formdata={
                '__Next': response.css('input#__Next::attr(value)').extract_first(),
                '__PageNumber':i,
                '__VIEWSTATE': response.css('input#__VIEWSTATE::attr(value)').extract_first(),
                }
                )
            i = i+1

这段代码成功地抓取了作业的第一页和发布的日期,但之后,我就不知道如何检索接下来的几页了。在


Tags: textfromhttpscom信息childresponsejob

热门问题