为什么我的formdata在我用scrapy发布时解码错误?

2024-09-30 20:34:03 发布

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

我希望使用scrapy和python2.7.11来刺激FormRequest抓取http://www.istic.ac.cn/suoguan/QiKan_ShouYe.htm?lan=en&journalId=IELEP0229&yp=2018

这是我的代码:

def start_requests(self):         
    posturl = 'http://www.istic.ac.cn/suoguan/essearch.ashx'
    url = 'http://www.istic.ac.cn/suoguan/QiKan_ShouYe.htm?lan=en&journalId=IELEP0229&yp=2018'
    journalId = re.search(r'journalId=(.*?)&', url).group(1)
    yearNum = re.search(r'&yp=(\d+)', url).group(1)
    postdata = {
    "indexname" : "xw_qk", 
    "search" : "{0}/F(F_ReqNum)*{1}/F(F_YEAR)".format(journalId, yearNum),
    "page" : "0",
    "pagenum" : "20",
    "sort" : "",
    "type" : "content",
    }
    print journalId, yearNum
    print postdata
    self.logger.info('Visit_headpage........................')
    yield FormRequest(posturl,  formdata = postdata, callback = self.parse_item)  

我需要在表格中发布以下数据:

^{pr2}$

正确抓取页面。在

但我的回答是什么都没有,所以我用fiddler找到了数据发布表单,它是:

indexname=xw_qk&
search=IELEP0229%2FF%28F_ReqNum%29%2A2018%2FF%28F_YEAR%29
&page=0&pagenum=20sort=&&type=content

所以这意味着这三个信号解码错误:'(',')','*'。
但当我在scrapy log中打印formdata时,它的格式仍然正确:

 {indexname':'xw_qk', 'search':'IELEP0229/(F_ReqNum)*2018/(F_YEAR)',
 'page':'0', 'pagenum':'20', 'sort':'', 'type':'content}

那我该怎么解决呢?在


Tags: selfhttpurlsearchwwwcnacyp
2条回答

我建议使用Request(method='POST')而不是{},因为我在使用这个函数时遇到了很多麻烦。在

并尝试像这样将参数直接附加到posturl

yield Request(url= posturl + "?search="+"{0}/F(F_ReqNum)*{1}/F(F_YEAR)".format(journalId, yearNum, method='POST')

并连接其他参数

他们发送的是相同的东西(scrapy的FormRequest只是url编码的),但我认为它发生的是,当你第一次登陆http://www.istic.ac.cn/suoguan/QiKan_ShouYe.htm?lan=en&journalId=IELEP0229&yp=2018时,它需要接收一个cookie,请尝试以下操作:

    # -*- coding: utf-8 -*-
import json
import re
import scrapy
from scrapy import FormRequest


class IsticSpider(scrapy.Spider):
    name = "istic"
    allowed_domains = ["istic.ac.cn"]
    start_urls = ['http://www.istic.ac.cn/suoguan/QiKan_ShouYe.htm?lan=en&journalId=IELEP0229&yp=2018']

    def parse(self, response):
        posturl = 'http://www.istic.ac.cn/suoguan/essearch.ashx'
        journalId = re.search(r'journalId=(.*?)&', response.url).group(1)
        yearNum = re.search(r'&yp=(\d+)', response.url).group(1)
        postdata = {
            "indexname" : "xw_qk",
            "search" : "{0}/F(F_ReqNum)*{1}/F(F_YEAR)".format(journalId, yearNum),
            "page" : "0",
            "pagenum" : "20",
            "sort" : "",
            "type" : "content",
        }
        yield FormRequest(posturl,  formdata = postdata, callback = self.parse_item)

    def parse_item(self, response):
        data = json.loads(response.body_as_unicode())
        self.logger.debug('%s', data.keys())

它应该输出[u'facets', u'hits', u'took']

相关问题 更多 >