Python 用Scrapy发送Post请求
我正试图从谷歌play商店抓取最新的评论,并获得我需要的帖子请求 在邮递员的帮助下,我得到了想要的回复 但终端中的post请求给了我一个服务器错误 例如:本页 给出服务器错误和 Scrapy忽略了这一行: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
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'} )