LINUX.ORG.RU

Как правильно скачивать страницы https?

 , ,


1

3

Спасибо всем за помощь.

Вот такой код работает:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;
using System.Net.Http.Headers;
using System.Net;

class Program
{
    static void Main()
    {
        Task t = new Task(DownloadPageAsync);
        t.Start();
        Console.WriteLine("Downloading page...");
        Console.ReadLine();
    }

    static async void DownloadPageAsync()
    {
        //string page = "https://www.linux.org.ru/forum/development/";
        string page = "https://www.blablacar.ru/user/show/f9037f00-7820-11e4-a000-0003efced283";

        HttpClientHandler handler = new HttpClientHandler()
        {
            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
        };
        using (HttpClient client = new HttpClient(handler))
        {
            client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/apng,*/*;q=0.8");
            client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
            client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
            client.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en;q=0.9,en-US;q=0.8");
            client.DefaultRequestHeaders.Add("Connection", "keep-alive");
            client.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
            client.DefaultRequestHeaders.Add("Pragma", "no-cache");
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko; Google Page Speed Insights) Chrome/27.0.1453 Safari/537.36");
            using (HttpResponseMessage response = await client.GetAsync(page))
            {
                using (HttpContent content = response.Content)
                {
                    string result = await content.ReadAsStringAsync();

                    File.WriteAllText("test.html", result);
                    Console.WriteLine("Done!");
                }
            }
        }
    }
}

★★★★★

Последнее исправление: fsb4000 (всего исправлений: 1)

не тянет на пальмовою ветвь, но ты силен однозначно.

Anoxemian ★★★★★
()

Ну сначала посмотри другие страницы скачиваются или нет. То есть проблема в коде или сайте? Может, он тебе 404 отдаёт, если понимает, что это ты с программки читать пытаешься?

turtle_bazon ★★★★★
()

В firefox страница открывается, а через программу так же как и с помощью wget скачивает страницу: «Упс, такой страницы не найдено»

Так firefox же шлёт заголовок со своим «User-Agent». Его пропускают. Поставь хотя бы что-то туда.

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 1)
Ответ на: комментарий от turtle_bazon

проблема в сайте, так как я специально показал закоментированный www.linux.org.ru/forum/development/

Эта страничка скачивается нормально, а blablacar нет...

fsb4000 ★★★★★
() автор топика
Ответ на: комментарий от gag

Изменил код на такой:

using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.IO;

class Program
{
    static void Main()
    {
        Task t = new Task(DownloadPageAsync);
        t.Start();
        Console.WriteLine("Downloading page...");
        Console.ReadLine();
    }

    static async void DownloadPageAsync()
    {
        //string page = "https://www.linux.org.ru/forum/development/";
        string page = "https://www.blablacar.ru/user/show/f9037f00-7820-11e4-a000-0003efced283";

        using (HttpClient client = new HttpClient())
        using (HttpResponseMessage response = await client.GetAsync(page))
        {
            response.Headers.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            response.Headers.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0");
            using (HttpContent content = response.Content)
            {
                string result = await content.ReadAsStringAsync();

                File.WriteAllText("test.html", result);
                Console.WriteLine("Done!");
            }
        }
    }
}

Теперь возвращает такую страничку:

<!--
Need permission to access data? Contact: DataAccess@datadome.co
-->
<html><head><title>You have been blocked</title><style>#cmsg{animation: A 1.5s;}@keyframes A{0%{opacity:0;}99%{opacity:0;}100%{opacity:1;}}</style></head><body style="margin:0"><p id="cmsg">Please enable JS and disable any ad blocker</p><script>var dd={'cid':'AHrlqAAAAAMAgdR5mpufkjAAU_aXyQ==','hsh':'1C17E1F027942805E00EE24A122A45','t':'fe'}</script><script src="https://ct.datado.me/c.js"></script></body></html>

fsb4000 ★★★★★
() автор топика

Импользуй curl вместо этого говна на дот говне.

invy ★★★★★
()
Ответ на: комментарий от Jopich1

Кстати спасибо, вроде помогло.

Одного user агента и задержки не хватало. Сайт всё равно понимал, что перед ним робот и банил :(

Сейчас вроде работает.

Помогло:

  • 15 секунд ожидания между переходом на другую страницу(при 10 секунд появлялась гугло капча после ~30 страницы)
  • Использование chromedriver + selenium

Почему так не любят роботов? Почему просто проверки количества запросов в минуту не достаточно?

fsb4000 ★★★★★
() автор топика
Последнее исправление: fsb4000 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.