Вероятно, вам не нужна случайная строка поиска. Вы, вероятно, хотите случайные темы. Вот некоторый код, который поможет вам. Сначала создайте список тем:
private readonly List<string> _topics = new List<string> {"dog", "car", "truck", "cat", "florida"};
Конечно, вы можете изменять, добавлять и удалять столько тем, сколько пожелаете. Далее мы создадим функцию для извлечения HTML-кода из поиска изображений Google, случайным образом выбирая одну из наших тем для поиска:
private string GetHtmlCode()
{
var rnd = new Random();
int topic = rnd.Next(0, _topics.Count - 1);
string url = "https://www.google.com/search?q=" + _topics[topic] + "&tbm=isch";
string data = "";
var request = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)request.GetResponse();
using (Stream dataStream = response.GetResponseStream())
{
if (dataStream == null)
return "";
using (var sr = new StreamReader(dataStream))
{
data = sr.ReadToEnd();
}
}
return data;
}
Когда у нас есть код HTML, нам нужно проанализировать теги img
, расположенные под таблицей images_table
, и сохранить URL-адреса изображений в списке:
private List<string> GetUrls(string html)
{
var urls = new List<string>();
int ndx = html.IndexOf("class=\"images_table\"", StringComparison.Ordinal);
ndx = html.IndexOf("<img", ndx, StringComparison.Ordinal);
while (ndx >= 0)
{
ndx = html.IndexOf("src=\"", ndx, StringComparison.Ordinal);
ndx = ndx + 5;
int ndx2 = html.IndexOf("\"", ndx, StringComparison.Ordinal);
string url = html.Substring(ndx, ndx2 - ndx);
urls.Add(url);
ndx = html.IndexOf("<img", ndx, StringComparison.Ordinal);
}
return urls;
}
Наша последняя функция, которая нам нужна, — это взять URL-адрес и загрузить байты изображения в массив байтов:
private byte[] GetImage(string url)
{
var request = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)request.GetResponse();
using (Stream dataStream = response.GetResponseStream())
{
if (dataStream == null)
return null;
using (var sr = new BinaryReader(dataStream))
{
byte[] bytes = sr.ReadBytes(100000);
return bytes;
}
}
return null;
}
Наконец, нам просто нужно связать все это вместе:
string html = GetHtmlCode();
List<string> urls = GetUrls(html);
var rnd = new Random();
int randomUrl = rnd.Next(0, urls.Count - 1);
string luckyUrl = urls[randomUrl];
byte[] image = GetImage(luckyUrl);
using (var ms = new MemoryStream(image))
{
pictureBox1.Image = Image.FromStream(ms);
}
ОБНОВЛЕНИЕ
Я получил несколько запросов об этом ответе с просьбой изменить его, чтобы он загружал фактическое полноразмерное изображение, а не миниатюру. Я изменил свой исходный код, чтобы теперь он загружал полноразмерные изображения вместо миниатюр.
Сначала, как и раньше, создайте список тем:
private readonly List<string> _topics = new List<string> { "dog", "car", "truck", "cat", "florida" };
Конечно, вы можете изменять, добавлять и удалять столько тем, сколько пожелаете. Далее мы создадим функцию для извлечения HTML-кода из поиска изображений Google, случайным образом выбирая одну из наших тем для поиска. GetHtmlCode()
здесь отличается от GetHtmlCode()
в миниатюре тем, что мы должны добавить Accept
и UserAgent
к запросу, иначе Google не предоставит нам полноразмерные URL-адреса изображений:
private string GetHtmlCode()
{
var rnd = new Random();
int topic = rnd.Next(0, _topics.Count - 1);
string url = "https://www.google.com/search?q=" + _topics[topic] + "&tbm=isch";
string data = "";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Accept = "text/html, application/xhtml+xml, */*";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";
var response = (HttpWebResponse)request.GetResponse();
using (Stream dataStream = response.GetResponseStream())
{
if (dataStream == null)
return "";
using (var sr = new StreamReader(dataStream))
{
data = sr.ReadToEnd();
}
}
return data;
}
Метод GetUrls()
также был переписан, потому что HTML-код, который мы получаем сейчас, отличается от HTML-кода, который мы получили в нашей «миниатюрной» версии. Он по-прежнему анализирует URL-адреса из HTML-кода:
private List<string> GetUrls(string html)
{
var urls = new List<string>();
int ndx = html.IndexOf("\"ou\"", StringComparison.Ordinal);
while (ndx >= 0)
{
ndx = html.IndexOf("\"", ndx + 4, StringComparison.Ordinal);
ndx++;
int ndx2 = html.IndexOf("\"", ndx, StringComparison.Ordinal);
string url = html.Substring(ndx, ndx2 - ndx);
urls.Add(url);
ndx = html.IndexOf("\"ou\"", ndx2, StringComparison.Ordinal);
}
return urls;
}
Наша последняя функция, которая нам нужна, — это взять URL-адрес и загрузить байты изображения в массив байтов. В этой функции есть только одно незначительное изменение, которое отличается от версии с миниатюрами. Нам пришлось изменить число в ReadBytes()
, так как теперь наши изображения будут больше:
private byte[] GetImage(string url)
{
var request = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)request.GetResponse();
using (Stream dataStream = response.GetResponseStream())
{
if (dataStream == null)
return null;
using (var sr = new BinaryReader(dataStream))
{
byte[] bytes = sr.ReadBytes(100000000);
return bytes;
}
}
return null;
}
Наконец, нам просто нужно связать все вместе, как и раньше:
string html = GetHtmlCode();
List<string> urls = GetUrls(html);
var rnd = new Random();
int randomUrl = rnd.Next(0, urls.Count - 1);
string luckyUrl = urls[randomUrl];
byte[] image = GetImage(luckyUrl);
using (var ms = new MemoryStream(image))
{
pictureBox1.Image = Image.FromStream(ms);
}
person
Icemanind
schedule
08.01.2015