Python 用Scrapy发送Post请求

Python 用Scrapy发送Post请求,python,python-3.x,scrapy,web-crawler,Python,Python 3.x,Scrapy,Web Crawler,我正试图从谷歌play商店抓取最新的评论,并获得我需要的帖子请求 在邮递员的帮助下,我得到了想要的回复 但终端中的post请求给了我一个服务器错误 例如:本页 给出服务器错误和 Scrapy忽略了这一行: frmdata = {"id": "com.supercell.boombeach", "reviewType": 0, "reviewSortOrder": 0, "pageNum":0} url = "https://play.google.com/store/getre

我正试图从谷歌play商店抓取最新的评论,并获得我需要的帖子请求

在邮递员的帮助下,我得到了想要的回复

但终端中的post请求给了我一个服务器错误

例如:本页

给出服务器错误和

Scrapy忽略了这一行:

frmdata = {"id": "com.supercell.boombeach", "reviewType": 0, "reviewSortOrder": 0, "pageNum":0}
        url = "https://play.google.com/store/getreviews"
        yield Request(url, callback=self.parse, method="POST", body=urllib.urlencode(frmdata))

确保
formdata
中的每个元素都是string/unicode类型

frmdata = {"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'}
url = "https://play.google.com/store/getreviews"
yield FormRequest(url, callback=self.parse, formdata=frmdata)
我想这个就行了

In [1]: from scrapy.http import FormRequest

In [2]: frmdata = {"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'}

In [3]: url = "https://play.google.com/store/getreviews"

In [4]: r = FormRequest(url, formdata=frmdata)

In [5]: fetch(r)
 2015-05-20 14:40:09+0530 [default] DEBUG: Crawled (200) <POST      https://play.google.com/store/getreviews> (referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x7f3ea4258890>
[s]   item       {}
[s]   r          <POST https://play.google.com/store/getreviews>
[s]   request    <POST https://play.google.com/store/getreviews>
[s]   response   <200 https://play.google.com/store/getreviews>
[s]   settings   <scrapy.settings.Settings object at 0x7f3eaa205450>
[s]   spider     <Spider 'default' at 0x7f3ea3449cd0>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser
[1]中的
:来自scrapy.http导入FormRequest
在[2]中,frmdata={“id”:“com.supercell.boombatch”,“reviewType:'0',“ReviewOrtOrder:'0',“pageNum:'0'}
在[3]中:url=”https://play.google.com/store/getreviews"
在[4]中:r=FormRequest(url,formdata=frmdata)
In[5]:fetch(r)
2015-05-20 14:40:09+0530[默认]调试:爬网(200)(参考:无)
[s] 可用的刮擦对象:
[s] 爬虫
[s] 项目{}
[s] r
[s] 请求
[s] 回应
[s] 背景
[s] 蜘蛛
[s] 有用的快捷方式:
[s] shelp()Shell帮助(打印此帮助)
[s] 获取(请求或url)获取请求(或url)并更新本地对象
[s] 查看(响应)在浏览器中查看响应

使用Scrapy中的Post遍历示例页面:

def directory_page(self,response):
    if response:
        profiles = response.xpath("//div[@class='heading-h']/h3/a/@href").extract()
        for profile in profiles:
            yield Request(urljoin(response.url,profile),callback=self.profile_collector)

        page = response.meta['page'] + 1
        if page :
            yield FormRequest('https://rotmanconnect.com/AlumniDirectory/getmorerecentjoineduser',
                                        formdata={'isSortByName':'false','pageNumber':str(page)},
                                        callback= self.directory_page,
                                        meta={'page':page})
    else:
         print "No more page available"

上述答案并没有真正解决问题。它们将数据作为参数发送,而不是作为请求主体发送JSON数据

发件人:


谢谢我仍然无法看到响应数据。如何获得它?response.body将为您提供完整的html元素。如果你想获取一些特定的条目,你可以使用
response.xpath(这里是你的xpath)
。这就是我在r.body'pageNum=0&id=com.supercell.Boombatch&reviewType=0&reviewSortOrder=0'上看到的内容。你是用r.body获取html数据吗?我已经执行了
fetch(r)
操作之后,然后尝试
response.body
,您肯定会得到结果。在代码中,您可以直接使用
yield-FormRequest(url=url,formdata=frmdata,callback=your\u callback\u func)而不是fetch(获取)
即可。我已经在scrapy shell中进行了测试,我不能在那里使用回调函数来测试它。我如何获得请求体结果?我使用
request.body
将表单数据返回给我…如果您想要请求的结果,您必须从响应中获取它。scrapy.Request可以有一个'callback'参数,如果请求被yieled('yield Request')并收到响应,则将调用该参数。要读取回调函数中的数据(例如:“def parse_entry(self,response)”),只需执行response.body。我使用了'jsonresponse=json.loads(response.body_作为_unicode())',因为我得到了一个json
def directory_page(self,response):
    if response:
        profiles = response.xpath("//div[@class='heading-h']/h3/a/@href").extract()
        for profile in profiles:
            yield Request(urljoin(response.url,profile),callback=self.profile_collector)

        page = response.meta['page'] + 1
        if page :
            yield FormRequest('https://rotmanconnect.com/AlumniDirectory/getmorerecentjoineduser',
                                        formdata={'isSortByName':'false','pageNumber':str(page)},
                                        callback= self.directory_page,
                                        meta={'page':page})
    else:
         print "No more page available"
my_data = {'field1': 'value1', 'field2': 'value2'}
request = scrapy.Request( url, method='POST', 
                          body=json.dumps(my_data), 
                          headers={'Content-Type':'application/json'} )