Python Scrapy Form Action在浏览器中的行为不同,没有redi

2024-09-28 05:17:42 发布

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

我正在为我工作的律师事务所开发一个从Wisconsin's Circuit Court Access程序中获取信息的无聊项目。我可以使用FormRequest.from_响应()方法,但响应是填充了字段和与表单操作匹配的URL的搜索页/案例搜索结果.do(为了简单起见,我省略了JSESSIONID和其他字段)

如果我在网络浏览器中打开网站/案例搜索结果.do302会把我转到/寻呼机.do其中有我需要抓取的案件搜索结果列表。问题是无论我做什么,我都不能得到重定向。我更改了用户代理字符串,将所有表单字段添加到formdata中,添加了请求之间的延迟,尝试了每个会话一个请求,但没有任何更改行为。在

需要注意的一点是,这种行为与在浏览器中没有填写足够的字段进行搜索时发生的情况相似,但不完全相同。在这种情况下,它也会把你送到/案例搜索结果.do对于搜索表单,就像它对我的scrapy请求一样,但是它会向HTML添加一条错误消息,而这个错误消息不会出现在scrapy响应中。在

我做了一些挖掘,似乎这个网站运行的是apachestruts?我没有找到任何关于爬行的建议。做页面,所以这可能是一个模糊的用例。我真的很想知道这是我做错了什么,还是我被标记为一个机器人,并提供了一个死胡同。在

这是我的蜘蛛:

import scrapy, datetime
from scrapy.shell import inspect_response

class ccapSpider(scrapy.Spider):
    name = 'ccapSpider'
    allowed_domains = ['wicourts.gov']
    start_urls = ['http://wcca.wicourts.gov/index.xsl']

    def parse(self, response):
        return scrapy.FormRequest.from_response(response, callback=self.parse2, formnumber=1)

    def parse2(self, response):
        returnedList = response.xpath('//a[starts-with(@href, "caseSearchSelect")]/@href').extract()
        url = 'http://wcca.wicourts.gov/' + returnedList[0]
        return  scrapy.Request(url, callback=self.parse3)

    def parse3(self, response):
        countyList = ['3', '6', '7', '9', '10', '17', '18', '27', '46', '47', '48', '50', '54', '55', '57', '60', '61', '65']
        today = datetime.date.today()
        startDate = today - datetime.timedelta(days=11)
        dateString = startDate.strftime('%x')
        for county in countyList:
                yield scrapy.FormRequest.from_response(response, callback=self.parseResults, clickdata={'value' : 'Search'}, formdata={'countyNo' : county, 'caseType'     : 'CV,SC', 'filingDate.dateString' : dateString, 'filingDateRange' : '5', 'recordsPerPage' : '50', 'partyName.showMissingMiddleNames' : 'true', 'partyDateOfBirth.orN    ull' : 'true', 'dispoDateRange' : '1', 'lastModifiedDateRange' : '1', 'documentsAddedDateRange' : '1', 'attyNoType' : 'partyAtty', 'offenseDateRange' : '1', 'partyNam    e.lastName' : '', 'partyName.firstName' : '', 'partyName.middleName' : '', 'partyDateOfBirth.dateString' : '', 'partyName.businessName' : '', 'caseRange.year' : '', '    caseRange.caseType' : '', 'caseRange.start' : '', 'caseRange.end' : '', 'statusCode' : '', 'dispoDate.dateString' : '', 'lastModifiedDate.dateString' : '', 'documents    AddedDate.dateString' : '', 'wcisClsCode' : '', 'oldCaseNo' : '', 'attyNo' : '', 'citnNo' : '', 'arrestTrackingNo' : '', 'justisNo' : '', 'ncicAgencyId' : '', 'daCase    No' : '', 'offenseDate.dateString' : '', 'prosAtty' : '', 'issAgencyNo' : '', 'showCountyLists' : 'Get a List of Prosecuting Attorneys by County', 'showCountyLists' :     'Get a List of Agencies by County'})

    def parseResults(self, response):
        caseDetailPages = response.xpath('//a[contains(@href, "caseDetails")]/@href').extract()
        urls = []
        for page in caseDetailPages:
            urls.append('http://wcca.wicourts.gov/' + page)
        for url in urls:
            yield scrapy.Request(url, callback=self.parseCaseDetails)
        nextPageList = response.xpath('//a[contains(@href, "offset=50")]/@href').extract()
        if nextPageList:
            nextPage = 'http://wcca.wicourts.gov/' + nextPageList[0]
            yield scrapy.Request(nextPage, callback=self.parsePage2)

编辑:我发现FormRequest不恰当地点击了一些按钮,使我返回到一个带有扩展选择框的搜索页面。页面中还有一个javascript片段,其中的注释引用了该按钮:

^{pr2}$

以下是之前源代码中有问题的按钮:

<INPUT class="formField" type="hidden" name="prosAtty" value=""> 
<INPUT class="formField" type="button" name="showCountyLists" value="Get a List of Prosecuting Attorneys by County" onclick="submitBtn('prosAttyListInitial')">
<input type="hidden" name="showCountyLists" class="prosAttyListInitial" value="Get a List of Prosecuting Attorneys by County" disabled="disabled">

<INPUT class="formField" type="hidden" name="issAgencyNo" value="">   
<INPUT class="formField" type="button" name="showCountyLists" value="Get a List of Agencies by County" onclick="submitBtn('agencyListInitial')">
<input type="hidden" name="showCountyLists" class="agencyListInitial" value="Get a List of Agencies by County" disabled="disabled">

在回应中:

              <SELECT class="formField" name="prosAtty">
                <OPTION class="formField" value="" selected="selected"></OPTION><OPTION class="formField" value="1000632">Alfredson, Patricia K. </OPTION>
                <OPTION class="formField" value="1023815">Altman, Elizabeth  </OPTION>
                <snip/>
                <OPTION class="formField" value="801">UWS</OPTION>
                <OPTION class="formField" value="311">Zoning Commission</OPTION>
              </SELECT><BR><INPUT class="formField" type="button" name="showCountyLists" value="Reload List" onclick="submitBtn('agencyListReload')"><input type="hidden" name="showCountyLists" class="agencyListReload" value="Reload List" disabled="disabled">

我想要点击的按钮:

<INPUT class="formField" TYPE="submit" name="formAction" value="Search"/>

是否需要指定clickdata参数中的每个属性?我用dont_click=True和clickdata={'value':'Search'}两种方法都试过了,而且它的行为方式是一样的。这可能是FormResponse处理隐藏字段时出现的问题吗?在


Tags: ofnameselfgetvalueresponsetypelist

热门问题