从httpwebresponse部分页源(partial page source from http

2019-09-28 04:20发布

我是很新,所以请原谅任何无知。

我创建了我的第一个多线程应用程序,它的目的是使众多webrequests,分析每个页面的源代码,并将结果保存在进一步审讯表。 理论上可能有多达30-40000的要求,因此需要多线程。 每个请求获得一个线程。 我觉得一切正常,只是我经常只得到一个非常局部页面的源代码。 这是几乎一样,如果在读取响应的StreamReader无谓的干扰。 我去用相同的请求,浏览器,并得到整个页面。 我认为它可能有,虽然我觉得我还是同步拨打电话与线程做。 (理想情况下,我想这样做异步调用,但我不知道如何去说。)有没有知道的一种方式,如果页面的源代码是完全以确定是否再次请求? 我相信这里有复杂性,我很想念。 在任何代码的任何帮助将不胜感激。

很抱歉的格式。 下面是使请求的类的部分代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Threading;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;  

namespace M4EverCrawler
{
    public class DomainRun
    {
        public void Start()
        {
            new Thread(new ThreadStart(this.Run1)).Start();  

            new Thread(new ThreadStart(this.Run2)).Start();

            new Thread(new ThreadStart(this.Run3)).Start();
        }


        public DomainRun(DNQueueManager dnq, ProxyQueueManager prxQ)
        {
            dnqManager = dnq;
            ProxyManager = prxQ;  
        }

        private DNQueueManager dnqManager;
        private ProxyQueueManager ProxyManager;
        public StagingQueue StagingQueue = new StagingQueue();
        public MetricsQueueManager MQmanager = new MetricsQueueManager();
        public CommitQueueManager CQmanager = new CommitQueueManager();


        protected void Run1()
        {
            dnqManager.LoadDNs();
            ProxyManager.LoadProxies();

            while (true)
            {
                if (dnqManager.IsDNDavailable)
                {
                    DomainData dnd = dnqManager.GetDND();
                    dnd.PageSource = CapturePage(dnd.DomainName);
                    StagingQueue.AddDN2Q(dnd);
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        protected void Run2()
        {
            while (true)
            {
                if (StagingQueue.IsDNDavailable)
                {
                    DomainData dnd = StagingQueue.GetDND();

                    MaxOutboundLinks = 3;
                    AvoidHttps = true;
                    InsideLinks = false;
                    VerifyBackLinks = true;

                    MQmanager.AddDN2Q(ParsePage(dnd));

                    foreach (string link in dnd.Hlinks)
                    {
                        DomainData dndLink = new DomainData(dnd.MainSeqno,link.ToString());
                        dndLink.ParentDomainName = dnd.DomainName;
                        dnd.PageSource = String.Empty;
                        MQmanager.AddDN2Q(dndLink);
                    }                    
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        protected void Run3()
        {
            while (true)
            {
                if (MQmanager.IsDNDavailable)
                {
                    DomainData dnd = MQmanager.GetDND();
                    RunAlexa(dnd);
                    RunCompete(dnd);
                    RunQuantcast(dnd);

                    CQmanager.AddDN2Q(dnd, MQmanager, 1000);
                }
                Thread.Sleep(new Random().Next(20));
            }
        }


        private string CapturePage(string URIstring)
        {
            Uri myUri;
            try
            {
                myUri = new Uri(URIstring);
            }
            catch (Exception URIex)
            {
                return String.Empty;
            }

            string proxyIP = ProxyManager.GetCurrentProxy() == "" ? ProxyManager.GetProxy() : ProxyManager.GetCurrentProxy();
            int proxCtr = 0;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(myUri);
            WebProxy Proxy = new WebProxy(proxyIP);
            request.Proxy = Proxy;
            request.Timeout = 20000;

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (StreamReader strmRdr = new StreamReader(response.GetResponseStream(), Encoding.ASCII))
                    {
                        return strmRdr.ReadToEnd();
                    }
                }
            }
            catch (InvalidOperationException Wex)
            {
                . . .
            }
        }

Answer 1:

您使用的ASCII编码一个StreamReader。 如果由服务器发送的数据没有一个有效的ASCII编码,然后StreamReader的将不能正确地将数据写入字符串。

请注意,服务器可能会被明确地把在任响应头的网页编码,或者使用网页内容本身META标记。

下面的页面显示了如何使用正确的编码数据下载: http://blogs.msdn.com/feroze_daud/archive/2004/03/30/104440.aspx

也有可能,你是不是从服务器获取完整的实体主体,这可能是由于不良代理,或别的东西。

也许你会想要诊断添加到您的应用程序。 登录该#bytes下载,使用代理服务器。 然后,你可以做一个Encoding.ASCII.GetBytes(串)。长度,并确保它是一样的下载#bytes。 如果不是,那么你有网页编码的问题。 如果不是的话,那么你有路径上的不良代理。

希望这可以帮助。



文章来源: partial page source from httpwebresponse