1. 程式人生 > >Scrapy FormRequest formdata 中dict value是dict情況解決方法

Scrapy FormRequest formdata 中dict value是dict情況解決方法

在編寫Scrapy 時會遇到這種情況


這樣在編寫post時使用以下程式碼無法實現:

yield scrapy.FormRequest(url, method='POST',formdata ={'body':{"modelId":"%s"%model['modelId'],"catid":'%s'%catid,"orderInt":"1"},'pi':'%s'%p,'ps':'60'},callback=self.get_item,dont_filter=True)

而且formdata的資料格式要求是字串,如果不是的話會報錯;

以上程式碼無法返回正確的網頁資料,通過以下方法可以解決(僅供參考,因為我是修改原始碼實現的,不明白原始碼為什麼要這麼做)

FormRequest函式的定義路徑在:D:\Python27\Lib\site-packages\Scrapy-1.0.6-py2.7.egg\scrapy\http\request\form.py


開啟form.py,把26行註釋掉,新增27行上去就可以了


原始碼如下:

#querystr = _urlencode(items, self.encoding) #old code,form data for dict in dict not work
querystr = urlencode(items, doseq=0) #my modify 
原因是_urlencode函式的問題,如果出現formdata的dict中的value是dict就會有問題的,所以我避免進入到該函式,避免錯誤,原始碼如下:
def _urlencode(seq, enc):
    values = [(unicode_to_str(k, enc), unicode_to_str(v, enc))
              for k, vs in seq
              for v in (vs if hasattr(vs, '__iter__') else [vs])]
    return urlencode(values, doseq=1)