2017-02-09 47 views
0

私はウェブサイトスクレーパーの作成に取り組んでいます。現在のページを変更するためのフォームがあります。Ruby Net :: HTTP ::投稿投稿フォーム

これはPOSTリクエストのフォームを送信する方法ですが、同じページを何度も繰り返しフェッチしているようです。ここで

は、いくつかのサンプルコードです:

pages = { 
"total_pages" => 19, 
"p1" => '1234/1456/78990/123324345/12143343214345/231432143/12432412/435435/', 
"p2" => '1432424/123421421/345/435/6/65/5/34/3/2/21/1243', 
.. 
.. 
..  
} 


idx = 1 
p_count = pages["total_pages"] 

#set up the HTTP request to change pages to get all the auction results 
uri = URI.parse("http://somerandomwebsite.com?listings") 
http = Net::HTTP.new(uri.host, uri.port) 
req = Net::HTTP::Post.new(uri.request_uri) 

p_count.times do 
    puts "On loop sequence: #{idx}" 
    pg_num = "p#{idx}" 
    pg_content = pages["#{pg_num}"] 
    req.set_form_data({"page" => "#{pg_num}", "#{pg_num}" => "#{pg_content}"}) 

    response = http.request(req) 
    page = Nokogiri::HTML(response.body) 
    idx = idx + 1 
end 

pageが変化したことがないように見えます。適切なパラメータが渡されていることを確認するたびに、完全な要求がどのように見えるかを確認する方法はありますか? reqについて何かを決定することは事実上不可能なようです。

+0

「[mcve]」をお読みください。コードは実行されません。問題を特定するためにテストするために、コードを変更する必要があります。それは私たちの時間を無駄にする。 Net :: HTTPではなく、Ruby用に存在する多くのHTTPクライアントの1つを使用することをお勧めします。 Net :: HTTPは新しいサーバータイプを発明している場合には優れていますが、特にページをリクエストしているときには、通常のHTTP作業では非常に低レベルです。リクエストを見る限り、httphttpbin.orgは非常に便利です。 –

答えて

0

デバッグHTTPへの素晴らしい方法はhttp://httpbin.orgの利点を取ることです:言わ

# >> { 
# >> "args": {}, 
# >> "data": "", 
# >> "files": {}, 
# >> "form": { 
# >>  "max": "50", 
# >>  "q": "ruby" 
# >> }, 
# >> "headers": { 
# >>  "Accept": "*/*", 
# >>  "Accept-Encoding": "gzip;q=1.0,deflate;q=0.6,identity;q=0.3", 
# >>  "Content-Length": "13", 
# >>  "Content-Type": "application/x-www-form-urlencoded", 
# >>  "Host": "httpbin.org", 
# >>  "User-Agent": "Ruby" 
# >> }, 
# >> "json": null, 
# >> "origin": "216.69.191.1", 
# >> "url": "http://httpbin.org/post" 
# >> } 

が、私はネット:: HTTPを使用していないお勧めします:返す

require 'net/http' 
uri = URI('http://httpbin.org/post') 
res = Net::HTTP.post_form(uri, 'q' => 'ruby', 'max' => '50') 
puts res.body 

。 Rubyには、コードを書くのが簡単になる素晴らしいHTTPクライアントがたくさんあります。例えば、ここで使用しても同じことですHTTPClient

require 'httpclient' 
clnt = HTTPClient.new 
res = clnt.post('http://httpbin.org/post', 'q' => 'ruby', 'max' => '50') 
puts res.body 

# >> { 
# >> "args": {}, 
# >> "data": "", 
# >> "files": {}, 
# >> "form": { 
# >>  "max": "50", 
# >>  "q": "ruby" 
# >> }, 
# >> "headers": { 
# >>  "Accept": "*/*", 
# >>  "Content-Length": "13", 
# >>  "Content-Type": "application/x-www-form-urlencoded", 
# >>  "Date": "Thu, 09 Feb 2017 20:03:57 GMT", 
# >>  "Host": "httpbin.org", 
# >>  "User-Agent": "HTTPClient/1.0 (2.8.3, ruby 2.4.0 (2016-12-24))" 
# >> }, 
# >> "json": null, 
# >> "origin": "216.69.191.1", 
# >> "url": "http://httpbin.org/post" 
# >> } 

これはあなたがほぼ十分に教えていなかったため未テストコードですが、私は何をやっているやって起動したいところそれはです:

require 'httpclient' 

BASE_URL = 'http://somerandomwebsite.com?listings' 
PAGES = [ 
'1234/1456/78990/123324345/12143343214345/231432143/12432412/435435/', 
'1432424/123421421/345/435/6/65/5/34/3/2/21/1243', 
] 

clnt = HTTPClient.new 

PAGES.each.with_index(1) do |page, idx| 
    puts "On loop sequence: #{idx}" 

    response = clnt.post(BASE_URL, 'page' => idx, idx => page) 

    doc = Nokogiri::HTML(response.body) 
    # ... 
end