Вы, вероятно, не хотите случайную строку поиска. Вероятно, вам нужны случайные темы. Вот какой код вам поможет. Во-первых, создать список тем:
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);
}
UPDATE
Я получил несколько запросов по поводу этого ответа с просьбой, что я могу изменить его, чтобы он загружает фактическое полноразмерное изображение, а не миниатюра. Я изменил свой исходный код, чтобы теперь загружать изображения полного размера вместо миниатюр.
Во-первых, как и раньше, создать список тем:
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, который мы вернули в нашей версии «thumbnail». Он по-прежнему разбирает из 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 и это загрузить байты изображения в массив байтов. В этой функции есть только одно незначительное изменение, отличное от версии «thumbnail».Нам пришлось изменить число в 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);
}
Действительно ли вы хотите, чтобы строка случайного поиска? например HE8IHN96HV3? Это скорее всего не вернет совпадений с изображениями Google. Вместо этого вы можете выбрать случайное слово из словаря, найти его, а затем выбрать случайное изображение из всех результатов. Чтобы на самом деле добиться этого на C#, ознакомьтесь с документацией API поиска Google по адресу https://googledotnet.codeplex.com/ – Karnivaurus
Спасибо Karnivaurus. Я проверю. –
Я мог бы просто увидеть, что, воспитывая некоторые ... ummm ... «интересные» результаты, я бы не включил его в бизнес-приложение. :-P – Ads