HamzaMcBob Ответов: 1

Сбор ссылок из websearch


Прежде чем мы начнем, я хочу сказать, что я понимаю, что у google и других есть специальные программы для синтаксического анализа и извлечения http, но из-за временных ограничений у меня не было времени научиться ими пользоваться, а некоторые стоили денег, которых у меня не так много.

Поэтому я сделал подход коллектора ссылок на основе регулярных выражений, основанный на ключевом слове, которое собирается из заголовка http другого веб-сайта, я просто пытаюсь найти все веб-сайты, которые говорят о подобных вещах в статье, из которой взято название. Поэтому я создал этот код, но он выводит 0 ссылок, может ли кто-нибудь помочь ...благодаря высоко ценится.

Overview of how it works. A URL is input in urlAddress, and the program collects all the https of that website, and I use a bit of code that extracts the title, I then join that title onto urlAddressofW and repeat but this time it does not represent a specific website but instead the screen after you have pressed search and before you open a specific website, when there are links to all the websites, the search results page. The code then extracts all the html of the first page of search results and feeds it through a regex "FindLinks" which I note, is kind of haphazardly combined so that may have been the problem, and this outputs all the links between the two points WebsiteExtractS and WebsiteExtractE which represents a link between the two, the code is then finally supposed to output each link it found, but outputs 0 links as the check NumofLinks stay as zero links.
string Titlestart = $"<title>";
string Titleend = $"</title>";
string WebsiteExtractS = $"iUh30 bc";
string WebsiteExtractE = $"&rsaquo";
string ADDING = "";
int NumofLinks = 0;
bool contains = false;


//Finding Website title
string urlAddress = "https://www.bbc.co.uk/news/uk-politics-50305284";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream = null;
    if (response.CharacterSet == null)
    {
        readStream = new StreamReader(receiveStream);
    }
    else
    {
        readStream = new StreamReader(receiveStream,
        Encoding.GetEncoding(response.CharacterSet));
        readStream.ToString();
        // Console.WriteLine(readStream);
    }
    string data = readStream.ReadToEnd();
    string ImpureText = data;

    int titlestart = ImpureText.IndexOf(Titlestart) + Titlestart.Length;
    int titleend = ImpureText.IndexOf(Titleend) - 10; // this will take x amount of characters off but unknow how many characters are present that need taking off.
    string PureTexttitle = ImpureText.Substring(titlestart, titleend - titlestart);
    Console.WriteLine("Title-" + PureTexttitle);












    //Using title to find Links
    ADDING = PureTexttitle;


    string urlAddressofW = "http://google.com/search?q=" + ADDING;

    HttpWebRequest requestW = (HttpWebRequest)WebRequest.Create(urlAddressofW);
    HttpWebResponse responseW = (HttpWebResponse)requestW.GetResponse();
    if (responseW.StatusCode == HttpStatusCode.OK)
    {
        Stream receiveStreamW = responseW.GetResponseStream();
        StreamReader readStreamW = null;
        if (responseW.CharacterSet == null)
        {
            readStreamW = new StreamReader(receiveStreamW);
        }
        else
        {
            readStreamW = new StreamReader(receiveStream,
            Encoding.GetEncoding(responseW.CharacterSet));
            readStreamW.ToString();

            //Console.WriteLine(readStreamW);

        }
        string dataW = readStreamW.ReadToEnd();
        string ImpureTextW = dataW.ToString();

        if (ImpureTextW.Contains("iUh30 bc"))
        {
            contains = false;
            Console.WriteLine("YELP");
        }


        //this code is never reached
        MatchCollection Findlinks = Regex.Matches(ImpureTextW, "iUh30 bc(.*?) &rsaquo");

        //var Findlinks = Regex.Matches(ImpureTextW, "<p>(.*?)</p>");


        foreach (Match Link in Findlinks)
        {



            Console.WriteLine(Link.Value);

            NumofLinks += 1;




        }
        Console.WriteLine(NumofLinks);



    }
}
Console.ReadLine();


Что я уже пробовал:

Попробовал отредактировать регулярное выражение, чтобы увидеть, была ли это проблема, и я думаю, что, похоже, это так, так как он говорит, что не может найти ничего, что содержится в коде регулярного выражения.

Выполнение проверок, чтобы увидеть, если ссылки даже собираются.

1 Ответов

Рейтинг:
9

Maciej Los

При первом взгляде я вижу 3 ошибки:
1.

//missing [s] in url addresss
string urlAddressofW = "https://google.com/search?q=" + ADDING;


2.
//Google replaces spaces [" "] with [+]
ADDING = PureTexttitle.Replace(" ", "+");


3.
//missing [W] in receiveStream
    if (responseW.StatusCode == HttpStatusCode.OK)
    {
        Stream receiveStreamW = responseW.GetResponseStream();
        StreamReader readStreamW = null;
        if (responseW.CharacterSet == null)
        {
            readStreamW = new StreamReader(receiveStreamW);
        }
        else
        {
            //here!!!
            readStreamW = new StreamReader(receiveStreamW,
            Encoding.GetEncoding(responseW.CharacterSet));
            readStreamW.ToString();

            //Console.WriteLine(readStreamW);

        }


Примечание: Google возвращает такой документ:
<!doctype html><html lang="pl"><head><meta charset="UTF-8"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>General election 2019: Greens call for £100bn a year for climate action - 

<!-- skipped lines here -->

<script nonce="FdWZZ+ZWymCQ/pKGYdroJA==">(function(){var e='YfDgXcOLDZ-70PEPlJ2wmA4';(function(){var a=e,b=window.performance&&window.performance.navigation;b&&2==b.type&&window.ping("/gen_204?ct=backbutton&ei="+a);}).call(this);})();(function(){var b=[function(){google.tick&&google.tick("load","dcl")}];google.dclc=function(a){b.length?b.push(a):a()};function c(){for(var a;a=b.shift();)a()}window.addEventListener?(document.addEventListener("DOMContentLoaded",c,!1),window.addEventListener("load",c,!1)):window.attachEvent&&window.attachEvent("onload",c);}).call(this);(function(){(function(){google.csct={};google.csct.ps='AOvVaw3FMWI9xeFwYcVhHj3sXm62\x26ust\x3d1575109089244484';})();})();(function(){(function(){google.csct.rd=true;})();})();google.drty&&google.drty();</script></body></html>


Примечание №2: я бы избегал создания новых объектов: HttpWebRequest и HttpWebResponse если только нет необходимости проходить через результаты первого запроса.


CPallini

5.

Maciej Los

Спасибо, Карло.

HamzaMcBob

Спасибо за помощь , я в какой-то степени переживал из-за этого, есть ли определенная причина , по которой я должен сделать #2, потому что мы не хотим попасть в неприятности с google?

Maciej Los

Нет. Чтобы избежать ошибок и использовать меньше памяти. :)