#c# #cookies #screen-scraping #wget
#c# #файлы cookie #очистка экрана #wget
Вопрос:
Я хотел бы загрузить некоторые данные с форума. Страница, содержащая данные, видна только зарегистрированным пользователям. Вот пример веб-страницы, содержащей пользовательские данные;
http://www.bikeforums.net/member.php/227664-StackOverflow
Я хотел бы получить данные с помощью wget или C #. Я попытался войти в систему через Firefox, затем передал файл cookies (надеюсь, содержащий регистрационную информацию) в wget. Это был скорее временный взлом, а не реальное решение, но он все равно не удался. Как мне сделать это правильно?
Я создал учетную запись для тестирования, если это полезно.
Пользователь: StackOverflow
Передача: so123
Ответ №1:
Используя firebug, вы можете легко получить данные POST для страницы входа и использовать их для создания веб-запроса и входа на форум.
Сервер создает файлы cookie для аутентификации, и мы можем использовать эти файлы cookie в следующем запросе на странице форума, чтобы сервер мог аутентифицировать запрос и вернуть все данные.
Здесь я протестировал простое консольное приложение, которое реализует этот механизм.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using System.Web;
using System.Net;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
CookieContainer cookieContainer = new CookieContainer();
HttpWebRequest wpost = (HttpWebRequest) HttpWebRequest.Create("http://www.bikeforums.net/login.php?do=login");
wpost.CookieContainer = cookieContainer;
wpost.Method = "POST";
string postData = "do=loginamp;vb_login_md5password=d93bd4ce1af6a9deccaf0ea844d6c05damp;vb_login_md5password_utf=d93bd4ce1af6a9deccaf0ea844d6c05damp;s=amp;securitytoken=guestamp;url=/member.php/227664-StackOverflowamp;vb_login_username=StackOverflowamp;vb_login_password=";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
wpost.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
wpost.ContentLength = byteArray.Length;
// Get the request stream.
System.IO.Stream dataStream = wpost.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
// Get the response.
HttpWebResponse response = (HttpWebResponse) wpost.GetResponse();
// Request
wpost = (HttpWebRequest)WebRequest.Create("http://www.bikeforums.net/member.php/227664-StackOverflow");
//Assing the cookies created on the server to the new request
wpost.CookieContainer = cookieContainer;
wpost.Method = "GET";
response = (HttpWebResponse)wpost.GetResponse();
Stream receiveStream = response.GetResponseStream();
// Pipes the stream to a higher level stream reader with the required encoding format.
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
//Display the result to console...
Console.WriteLine(readStream.ReadToEnd());
response.Close();
readStream.Close();
Console.Read();
}
}
}