2015-05-20 27 views
13

Tôi đang cố gắng thu thập đánh giá mới nhất từ ​​cửa hàng Google Play nhưng tôi cần phải thực hiện yêu cầu đăng bài để nhận các đánh giá mới nhất.Gửi yêu cầu đăng trong Scrapy

Với Người đưa thư hoạt động và tôi nhận được phản hồi mong muốn.

enter image description here

nhưng yêu cầu bài tại nhà ga mang lại cho tôi một lỗi máy chủ

Đối với ví dụ: cho trang này https://play.google.com/store/apps/details?id=com.supercell.boombeach

curl -H "Content-Type: application/json" -X POST -d '{"id": "com.supercell.boombeach", "reviewType": '0', "reviewSortOrder": '0', "pageNum":'0'}' https://play.google.com/store/getreviews 

đưa ra một lỗi máy chủ và

Scrapy chỉ cần bỏ qua dòng này:

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)) 

Trả lời

18

Hãy chắc chắn rằng mỗi phần tử trong formdata của bạn là kiểu 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) 

Tôi nghĩ rằng điều này sẽ làm

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 
+0

Cảm ơn. Tôi vẫn không thể xem dữ liệu phản hồi. Làm thế nào để có được nó? –

+2

response.body sẽ cung cấp cho bạn phần tử html hoàn chỉnh. Nếu bạn muốn thực hiện một số mục cụ thể, bạn có thể sử dụng 'response.xpath (YOUR_XPATH_HERE)'. – Jithin

+0

Thiis là những gì tôi nhận được trên trang r.body'Num = 0 & id = com.supercell.boombeach & reviewType = 0 & reviewSortOrder = 0 ' –

0

Sample Page Vượt qua sử dụng bài viết trong Scrapy:

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" 
11

Câu trả lời ở trên không thực sự giải quyết được vấn đề. Họ đang gửi dữ liệu dưới dạng tham số thay vì dữ liệu JSON làm phần thân của yêu cầu.

Từ http://bajiecc.cc/questions/1135255/scrapy-formrequest-sending-json:

my_data = {'field1': 'value1', 'field2': 'value2'} 
request = scrapy.Request(url, method='POST', 
          body=json.dumps(my_data), 
          headers={'Content-Type':'application/json'}) 
+0

Làm cách nào tôi có thể nhận được kết quả cơ thể yêu cầu? Tôi sử dụng '' 'request.body''' nó trả lại cho tôi dữ liệu biểu mẫu ... –

+1

Nếu bạn muốn kết quả của yêu cầu, bạn phải lấy nó từ phản hồi. Hàm scrapy.Request có thể có đối số 'gọi lại' sẽ được gọi nếu yêu cầu được sinh ra ('yêu cầu lợi nhuận') và nhận được phản hồi. Để đọc dữ liệu trong hàm gọi lại (ví dụ: 'def parse_entry (self, response)') chỉ cần thực hiện response.body. Tôi đã sử dụng 'jsonresponse = json.loads (response.body_as_unicode())' vì tôi nhận được một json – aitorhh

Các vấn đề liên quan