精华内容
下载资源
问答
  • 最近在做一个分享功能,根据用户输入的网站 自动抓取链接中的文本及图片内容,根据自己的需求和思路 整理了一个通用的类,下次使用的时候直接可以调用,也分享在这里,希望能给用的着的朋友带来方便。 网页...

    最近在做一个分享功能,根据用户输入的网站 自动抓取链接中的文本及图片内容,根据自己的需求和思路

    整理了一个通用的类,下次使用的时候直接可以调用,也分享在这里,希望能给用的着的朋友带来方便。

     

     

    ExpandedBlockStart.gif网页抓取类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Collections;
    using System.IO.Compression;

    /// <summary>
    ///Name:网页抓取类
    ///Author:loafinweb
    ///Date:2011-09-12
    /// </summary>
    public class webCrawl
    {
        
    public webCrawl() { }

        
    //获取网页字符根据url  
        public static string getHtml(string url)
        {
            
    try
            {
                
    string str = "";
                Encoding en 
    = Encoding.GetEncoding(getEncoding(url));
                HttpWebRequest request 
    = (HttpWebRequest)WebRequest.Create(url);
                request.Headers.Set(
    "Pragma""no-cache");
                request.Timeout 
    = 30000;
                HttpWebResponse response 
    = (HttpWebResponse)request.GetResponse();
                
    if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
                {
                    Stream strM 
    = response.GetResponseStream();
                    StreamReader sr 
    = new StreamReader(strM, en);
                    str 
    = sr.ReadToEnd();
                    strM.Close();
                    sr.Close();
                }
                
    return str;
            }
            
    catch
            {
                
    return String.Empty;
            }
        }

        
    //获取编码
        public static string getEncoding(string url)
        {
            HttpWebRequest request 
    = null;
            HttpWebResponse response 
    = null;
            StreamReader reader 
    = null;
            
    try
            {
                request 
    = (HttpWebRequest)WebRequest.Create(url);
                request.Timeout 
    = 30000;
                request.AllowAutoRedirect 
    = false;

                response 
    = (HttpWebResponse)request.GetResponse();
                
    if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
                {
                    
    if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        reader 
    = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                    
    else
                        reader 
    = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

                    
    string html = reader.ReadToEnd();

                    Regex reg_charset 
    = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                    
    if (reg_charset.IsMatch(html))
                    {
                        
    return reg_charset.Match(html).Groups["charset"].Value;
                    }
                    
    else if (response.CharacterSet != string.Empty)
                    {
                        
    return response.CharacterSet;
                    }
                    
    else
                        
    return Encoding.Default.BodyName;
                }
            }
            
    catch (Exception ex)
            {
                
    throw new Exception(ex.Message);
            }
            
    finally
            {
                
    if (response != null)
                {
                    response.Close();
                    response 
    = null;
                }
                
    if (reader != null)
                    reader.Close();

                
    if (request != null)
                    request 
    = null;
            }
            
    return Encoding.Default.BodyName;
        }

        
    //根据内容--获取标题
        public static string getTitle(string url)
        {
            
    string title = string.Empty;
            
    string htmlStr = getHtml(url);//获取网页
            Match TitleMatch = Regex.Match(htmlStr, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            title 
    = TitleMatch.Groups[1].Value;
            title 
    = Regex.Replace(title, @"\W""");//去除空格
            return title;

        }

        
    //根据内容--获取描述信息
        public static string getDescription(string url)
        {
            
    string htmlStr = getHtml(url);
            Match Desc 
    = Regex.Match(htmlStr, "<meta name=\"Description\" content=\"([^<]*)\"*>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            
    string mdd = Desc.Groups[1].Value;
            
    return Regex.Replace(Desc.Groups[1].Value, @"\W""");
        }


        
    //根据内容--获取所有链接
        public static List<string> getLink(string htmlStr)
        {
            List
    <string> list = new List<string>(); //用来存放链接       
            String reg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";  //链接的正则表达式      
            Regex regex = new Regex(reg, RegexOptions.IgnoreCase);
            MatchCollection mc 
    = regex.Matches(htmlStr);
            
    for (int i = 0; i < mc.Count; i++//存放匹配的集合
            {
                
    bool hasExist = false;   //链接存在与否的标记         
                String name = mc[i].ToString();
                
    foreach (String one in list)
                {
                    
    if (name == one)
                    {
                        hasExist 
    = true//链接已存在                   
                        break;
                    }
                }
                
    if (!hasExist) list.Add(name); //链接不存在,添加
            }
            
    return list;

        }

        
    //根据内容--取得body内的内容
        public static string getBody(string url)
        {
            
    string htmlStr = getHtml(url);
            
    string result = string.Empty;
            Regex regBody 
    = new Regex(@"(?is)<body[^>]*>(?:(?!</?body\b).)*</body>");
            Match m 
    = regBody.Match(htmlStr);
            
    if (m.Success)
            {
                result 
    = parseHtml(m.Value);
            }
            
    return result;
        }

        
    //获取所有图片
        public static List<string> getImg(string url)
        {
            List
    <string> list = new List<string>();
            
    string temp = string.Empty;
            
    string htmlStr = getHtml(url);
            MatchCollection matchs 
    = Regex.Matches(htmlStr, @"<(IMG|img)[^>]+>"); //抽取所有图片
            for (int i = 0; i < matchs.Count; i++)
            {
                list.Add(matchs[i].Value);
            }
            
    return list;
        }

        
    //所有图片路径(如果是相对路径的话,自动设置成绝对路径)
        public static List<string> getImgPath(string url)
        {
            List
    <string> list = new List<string>();
            
    string htmlStr = getHtml(url);
            
    string pat = @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>";
            MatchCollection matches 
    = Regex.Matches(htmlStr, pat, RegexOptions.IgnoreCase | RegexOptions.Multiline);
            
    foreach (Match m in matches)
            {
                
    string imgPath = m.Groups["imgUrl"].Value.Trim();
                
    if (Regex.IsMatch(imgPath, @"\w+\.(gif|jpg|bmp|png)$")) //用了2次匹配,去除链接是网页的 只留图片
                {
                    
    if (!imgPath.Contains("http"))//必须包含http 否则无法下载
                    {
                        imgPath 
    = getUrl(url) + imgPath;
                    }
                    list.Add(imgPath);
                }
            }
            
    return list;
        }

        
    //下载图片
        public void DownloadImg(string fileurl)
        {
            
    if (fileurl.Contains('.'))//url路径必须是绝对路径 例如http://xxx.com/img/logo.jpg 
            {
                
    string imgName = DateTime.Now.ToString("yyyyMMddHHmmssffff"+ fileurl.Substring(fileurl.LastIndexOf('.')); // 生成图片的名字
                string filepath = System.Web.HttpContext.Current.Server.MapPath(""+ "/" + imgName;
                WebClient mywebclient 
    = new WebClient();
                mywebclient.DownloadFile(fileurl, filepath);
            }
        }

        
    //过滤html
        public static string parseHtml(string html)
        {
            
    string value = Regex.Replace(html, "<[^>]*>"string.Empty);
            value 
    = value.Replace("<"string.Empty);
            value 
    = value.Replace(">"string.Empty);
            
    //return value.Replace("&nbsp;", string.Empty);

            
    return Regex.Replace(value, @"\s+""");
        }

        
    //处理url路径问题
        public static string getUrl(string url)
        {
            
    //如果是http://www.xxx.com           返回http://www.xxx.com/
            
    //如果是http://www.xxx.com/art.aspx  返回http://www.xxx.com/
            return url = url.Substring(0, url.LastIndexOf('/')) + "/";
        }
    }

     

    转载于:https://www.cnblogs.com/clc2008/archive/2011/09/12/2174284.html

    展开全文
  • 最近在做一个分享功能,根据用户输入的网站 自动抓取链接中的文本及图片内容,根据自己的需求和思路 整理了一个通用的类,下次使用的时候直接可以调用,也分享在这里,希望能给用的着的朋友带来方便。 网页抓取类 ...

    最近在做一个分享功能,根据用户输入的网站 自动抓取链接中的文本及图片内容,根据自己的需求和思路

    整理了一个通用的类,下次使用的时候直接可以调用,也分享在这里,希望能给用的着的朋友带来方便。

    网页抓取类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Collections;
    using System.IO.Compression;

    /// <summary>
    ///Name:网页抓取类
    ///Author:loafinweb
    ///Date:2011-09-12
    /// </summary>
    public class webCrawl
    {
        
    public webCrawl() { }

        
    //获取网页字符根据url  
        public static string getHtml(string url)
        {
            
    try
            {
                
    string str = "";
                Encoding en 
    = Encoding.GetEncoding(getEncoding(url));
                HttpWebRequest request 
    = (HttpWebRequest)WebRequest.Create(url);
                request.Headers.Set(
    "Pragma""no-cache");
                request.Timeout 
    = 30000;
                HttpWebResponse response 
    = (HttpWebResponse)request.GetResponse();
                
    if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
                {
                    Stream strM 
    = response.GetResponseStream();
                    StreamReader sr 
    = new StreamReader(strM, en);
                    str 
    = sr.ReadToEnd();
                    strM.Close();
                    sr.Close();
                }
                
    return str;
            }
            
    catch
            {
                
    return String.Empty;
            }
        }

        
    //获取编码
        public static string getEncoding(string url)
        {
            HttpWebRequest request 
    = null;
            HttpWebResponse response 
    = null;
            StreamReader reader 
    = null;
            
    try
            {
                request 
    = (HttpWebRequest)WebRequest.Create(url);
                request.Timeout 
    = 30000;
                request.AllowAutoRedirect 
    = false;

                response 
    = (HttpWebResponse)request.GetResponse();
                
    if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
                {
                    
    if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                        reader 
    = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                    
    else
                        reader 
    = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

                    
    string html = reader.ReadToEnd();

                    Regex reg_charset 
    = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                    
    if (reg_charset.IsMatch(html))
                    {
                        
    return reg_charset.Match(html).Groups["charset"].Value;
                    }
                    
    else if (response.CharacterSet != string.Empty)
                    {
                        
    return response.CharacterSet;
                    }
                    
    else
                        
    return Encoding.Default.BodyName;
                }
            }
            
    catch (Exception ex)
            {
                
    throw new Exception(ex.Message);
            }
            
    finally
            {
                
    if (response != null)
                {
                    response.Close();
                    response 
    = null;
                }
                
    if (reader != null)
                    reader.Close();

                
    if (request != null)
                    request 
    = null;
            }
            
    return Encoding.Default.BodyName;
        }

        
    //根据内容--获取标题
        public static string getTitle(string url)
        {
            
    string title = string.Empty;
            
    string htmlStr = getHtml(url);//获取网页
            Match TitleMatch = Regex.Match(htmlStr, "<title>([^<]*)</title>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            title 
    = TitleMatch.Groups[1].Value;
            title 
    = Regex.Replace(title, @"\W""");//去除空格
            return title;

        }

        
    //根据内容--获取描述信息
        public static string getDescription(string url)
        {
            
    string htmlStr = getHtml(url);
            Match Desc 
    = Regex.Match(htmlStr, "<meta name=\"Description\" content=\"([^<]*)\"*>", RegexOptions.IgnoreCase | RegexOptions.Multiline);
            
    string mdd = Desc.Groups[1].Value;
            
    return Regex.Replace(Desc.Groups[1].Value, @"\W""");
        }


        
    //根据内容--获取所有链接
        public static List<string> getLink(string htmlStr)
        {
            List
    <string> list = new List<string>(); //用来存放链接       
            String reg = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";  //链接的正则表达式      
            Regex regex = new Regex(reg, RegexOptions.IgnoreCase);
            MatchCollection mc 
    = regex.Matches(htmlStr);
            
    for (int i = 0; i < mc.Count; i++//存放匹配的集合
            {
                
    bool hasExist = false;   //链接存在与否的标记         
                String name = mc[i].ToString();
                
    foreach (String one in list)
                {
                    
    if (name == one)
                    {
                        hasExist 
    = true//链接已存在                   
                        break;
                    }
                }
                
    if (!hasExist) list.Add(name); //链接不存在,添加
            }
            
    return list;

        }

        
    //根据内容--取得body内的内容
        public static string getBody(string url)
        {
            
    string htmlStr = getHtml(url);
            
    string result = string.Empty;
            Regex regBody 
    = new Regex(@"(?is)<body[^>]*>(?:(?!</?body\b).)*</body>");
            Match m 
    = regBody.Match(htmlStr);
            
    if (m.Success)
            {
                result 
    = parseHtml(m.Value);
            }
            
    return result;
        }

        
    //获取所有图片
        public static List<string> getImg(string url)
        {
            List
    <string> list = new List<string>();
            
    string temp = string.Empty;
            
    string htmlStr = getHtml(url);
            MatchCollection matchs 
    = Regex.Matches(htmlStr, @"<(IMG|img)[^>]+>"); //抽取所有图片
            for (int i = 0; i < matchs.Count; i++)
            {
                list.Add(matchs[i].Value);
            }
            
    return list;
        }

        
    //所有图片路径(如果是相对路径的话,自动设置成绝对路径)
        public static List<string> getImgPath(string url)
        {
            List
    <string> list = new List<string>();
            
    string htmlStr = getHtml(url);
            
    string pat = @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>";
            MatchCollection matches 
    = Regex.Matches(htmlStr, pat, RegexOptions.IgnoreCase | RegexOptions.Multiline);
            
    foreach (Match m in matches)
            {
                
    string imgPath = m.Groups["imgUrl"].Value.Trim();
                
    if (Regex.IsMatch(imgPath, @"\w+\.(gif|jpg|bmp|png)$")) //用了2次匹配,去除链接是网页的 只留图片
                {
                    
    if (!imgPath.Contains("http"))//必须包含http 否则无法下载
                    {
                        imgPath 
    = getUrl(url) + imgPath;
                    }
                    list.Add(imgPath);
                }
            }
            
    return list;
        }

        
    //下载图片
        public void DownloadImg(string fileurl)
        {
            
    if (fileurl.Contains('.'))//url路径必须是绝对路径 例如http://xxx.com/img/logo.jpg 
            {
                
    string imgName = DateTime.Now.ToString("yyyyMMddHHmmssffff"+ fileurl.Substring(fileurl.LastIndexOf('.')); // 生成图片的名字
                string filepath = System.Web.HttpContext.Current.Server.MapPath(""+ "/" + imgName;
                WebClient mywebclient 
    = new WebClient();
                mywebclient.DownloadFile(fileurl, filepath);
            }
        }

        
    //过滤html
        public static string parseHtml(string html)
        {
            
    string value = Regex.Replace(html, "<[^>]*>"string.Empty);
            value 
    = value.Replace("<"string.Empty);
            value 
    = value.Replace(">"string.Empty);
            
    //return value.Replace("&nbsp;", string.Empty);

            
    return Regex.Replace(value, @"\s+""");
        }

        
    //处理url路径问题
        public static string getUrl(string url)
        {
            
    //如果是http://www.xxx.com           返回http://www.xxx.com/
            
    //如果是http://www.xxx.com/art.aspx  返回http://www.xxx.com/
            return url = url.Substring(0, url.LastIndexOf('/')) + "/";
        }
    }



    http://www.soaspx.com/dotnet/asp.net/tech/tech_20110913_8052.html

    展开全文
  • 爬虫知识整理

    2018-03-17 08:10:02
    目录 ...宽度与深度抓取的比较 不重复抓取策略及BloomFilter ...HTML:超文本标记语言,浏览器根据HTML语言规范来解析网页内容 tag:&lt;a&gt;&lt;tr&gt;&lt;p&gt; a用于标记外链,tr、p用来...

    目录

    1. HTML相关技术
    2. HTTP协议
    3. 宽度与深度抓取的比较
    4. 不重复抓取策略及BloomFilter
    5. 网站结构分析
    6. 网页内容解析
    7. 动态网页的解析
    8. 网站登录
    9. 多线程与多进程
    10. 分布式
    11. 应对网站的反爬技术

    1.HTML相关技术

    • HTML:超文本标记语言,浏览器根据HTML语言规范来解析网页内容
    • tag:<a><tr><p> a用于标记外链,tr、p用来对内容进行定位抽取
    • id、class也可以用于定位元素
    • DOM树是将网页的内容表示成类似树的形式,方便网页数据的分析和提取
    • Javascript 运行在前端的编程语言,典型应用为动态网页数据、内容的加载和呈现,在网络请求时常用的技术是AJAX,专门用来异步请求数据

    2.HTTP协议

    2.1 TCP/IP & OSI

    首先复习一下常见的TCP/IP的四层协议和OSI的七层协议,如下图所示
    这里写图片描述

    • 物理层:电器连接
    • 数据链路层:交换机,STP,帧中继
    • 网络层:路由器,IP协议
    • 传输层:TCP,UDP协议
    • 会话层:建立通信连接,网络拨号
    • 表示层:每次连接只处理一个请求
    • 应用层:HTTP、FTP
      • 无连接:每次连接只处理一个请求
      • 无状态:每次连接、传输都是独立的

    2.2 HTTP HEADER

    下图是REQUEST的一个HEADER示例
    这里写图片描述
    由于HTTP是一个请求-响应模式的典型范例,是有keep-alive功能使客户端到服务器端的链接持续有效,当出现对服务器的后继请求是,keep-alive功能避免了建立或者重新建立链接。

    2.3HTTP响应状态码

    • 2XX:成功
    • 3XX:跳转
      • 300: 存在多个可用的资源
      • 301:重定向
      • 302:重定向
      • 304:请求的资源未更新,丢弃
    • 4XX:客户端错误
      • 400:客户端请求有语法错误,不能被服务器所理解
        解决方法:检查请求的参数或者路径是否正确
      • 401:请求未经授权,这个状态码必须和www-Authenticate报头域一起使用
        解决方法:尝试重新登录
      • 403:服务器决绝服务
        解决方法:(1)如果是需要登录的网站,尝试重新登录(2)可能是网站的反爬政策导致IP被封,通过暂停爬取,增加爬虫等待时间,更改网络IP
      • 404:请求资源不存在
        解决方法:直接丢弃该URL
    • 5XX:解决方法:丢弃对用url,计数,出现多次连续情况时,报错,爬虫停止
      • 500:服务器发生错误
      • 503:当前不能处理客户端的请求,一段时间后可恢复正常

    3.宽度与深度抓取的比较

    • 宽度优先策略如下图所示:
      这里写图片描述
      上图的爬取顺序是ABCDEFGXYZHIJK
      宽度优先就是从起始页面开始,先对同一页面中的其他URL进行抓取,然后再对该层次网页所指向的下一层次网页进行抓取。其优点是可以实现并行抓取,提高抓取速度。
    • 深度优先策略如下图所示:
      这里写图片描述
      上图的顺序是ABCDEFGH
      深度优先策略从起始页开始,一个URL一个URL跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。其优点是设计简单。
    • 策略选择
      深度限制于宽度优先相结合

    4. 不重复抓取策略及BloomFilter

    4.1常用的记录抓取历史的方法

    • 将访问郭的URL保存到数据库, 此方法效率较低
    • 用HashSet将访问过测URL保存起来,时间代价为O(1),但是会消耗内存
    • URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库
    • Bit-Map方法,建立一个BitSet,将每个URL经过一个哈希函数映射到某一位
    • Bloom Filter:使用多个哈希函数,创建一个m位的BitSet

    4.2如何有效记录抓取历史

    • 多数情况不需要压缩,尤其是网页数量少的情况
    • 网页数量大的情况下,使用BloomFilter压缩
    • 重点是计算碰撞概率,确定存储空间阈值
    • 使用分布式系统,将散列映射到多台主机的内存

    5.网站结构分析

    利用sitmap来分析网站结构和估算目标网页的规模
    - 利用sitemap中的信息,直接对目标网页进行抓取
    - 对网站目录结构进行分析,大多数网站都会存在明确的top-down的分类的目录结构,可以进入特定的目录进行抓取。在特定目录下,url尤其固定的构成形式,我们可以对其根据相关信息构造url

    6. 网页内容解析

    • xpath
      基本语法
      这里写图片描述
      =符号要求属性完全匹配,可以用contains方法来部分匹配
      andor运算符可以判断两个条件同时成立或其中一个成立
    • 正则表达式
      常用规则:

    这里写图片描述

    7. 动态网页的解析

    7.1动态网页的使用场景

    • 单页模式:不需要外部跳转的页面
    • 页面交互:页面有很多用户交互接口
    • 内容及模块丰富:网页内容多,一次加载对服务器压力大,用户也往往不会全部查看内容

    7.2解析动态网页的方法

    • 分析网页加载过程中的请求内容,查看是否有新请求url,如果有,可以分析该url的构造规律,自行构造url,这种方法在分析url的时候虽然比较耗时,但是对提高爬虫效率缺很有效
    • 使用Phantomjs和selenium webdriver,可以将网页中的动态部分全部加载出来再进行爬取,但是受网速影响较大,效率不是很高
      Phantomjs:一种基于Webkit的Headless的web引擎
      selenium:一个自动化的Web测试工具
      Phantomjs常用基本设置:
      这里写图片描述

    • selenium通过浏览器的驱动,支持大量的HTML及JavaScript的操作,常用的可以包括:
      这里写图片描述
      selenium在退出时必须调用driver.close()driver.quit()退出Phantomjs, 否则Phantomjs会一直在后台运行占用资源。

    8. 网站登录

    8.1 Phantomjs + selenium

    (1)设置User-Agent

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    user_agent = ("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap["phantomjs.page.settings.userAgent"] = user_agent
    driver = webdriver.PhantomJS(desired_capabilities=dcap)

    (2)输入用户名与密码,找到相应的表单位置,通过send_keys()来传递value

    driver.find_element_by_id('loginname').send_keys(username)
    driver.find_element_by_name('password').send_keys(password)

    8.2 表单登录

    8.2.1 HTML提交数据

    (1) form表单:由浏览器实现POST方法

    <form>
        <input type="text" name="username">
    </form>

    (2) ajax请求:基于ajax技术,异步发送http请求并获得返回数据,然后利用JavaScript对网页进行处理

    $.(ajax){
    }

    8.2.2 登录过程

    (1)根据chrome inspector 里面检查到的参数,来设置登录方式

    • 最常用的是x-www-form-urlencoded 和json方式,两种方式知识body的编码不同
    • 如果是form-data,按照form-data的方式组合body
    • body部分经常需要按照特定的方式编码,比如base64,或者MD5
    • 对于非常复杂的登录协议,利用pantomjs+selenium登录

    (2)request = urllib2.Request(url, data, headers= loginheaders)

    • url:访问地址
    • data:body的部分
    • headers=loginheaders是HTTP请求的HEADER数据

    8.2.3获取并设置cookie

    登录的主要目的就是为了获取cookie,登录成功,HEADER就会设置cookie相关的信息,再后续的请求中继续使用该cookie。但是有时会遇到网页登录后返回302的情况,此时urllib2的response会丢失set-cookie的信息,导致登录不成功,这时需要自动处理cookie,一般可以使用以下插件:

    • urllib2可以绑定一系列的处理对象handler,提供额外的功能支持
    • 使用CookieJar

    9. 多线程与多进程

    9.1实现一个多线程爬虫

    1. 创建一个线程池 threads = []
    2. 确认url队列线程安全Queue Deque
    3. 从队列中取出url,分配一个线程开始爬取pop()、get() threading.Thread
    4. 若果线程池满了,循环等待,直到线程结束 t.is_alive()
    5. 从线程池移除已经完成下载的线程, thread.remove(t)
    6. 如果当前级别的url已经遍历完成,t.join()函数等待所有现场结束,然后开始下一级爬取

    9.1.1优势

    • 有效利用CPU时间
    • 极大减小下载出错、阻塞对抓取速度的影响,整体上提高下载的速度
    • 对于没有反爬虫限制的网站,下载速度可以多倍增加

    9.1.2局限

    • 对于有反爬的网站,速度提升有限
    • 提高了复杂度,对编码要求更高
    • 线程越多,每个线程获得的时间就越少,同时线程切换更频繁也带来了额外开销
    • 线程之间资源竞争更激烈

    9.2实现一个多进程爬虫

    (1)C/S模式
    1. 一个服务进程,入队及出队URL。入队需检查是否已经下载
    2. 监控目前的爬取状态、进度
    3. 多个爬虫进程,从服务进程获取URL,并将新的URL返回给服务进程
    4. 使用Socket来做IPC
    (2)数据库模式
    1. 使用数据库来读写爬取列表
    2. 多个爬取进程,URL的获取与增加都通过数据库操作

    9.2.1目的

    • 控制线程数量
    • 对线程进行隔离,减少资源竞争
    • 某些环境下,在单机上利用多个IP来伪装

    9.2.2局限

    • 不能突破网络瓶颈
    • 单机单IP的情况下,变得没有意义
    • 数据交换的代价更大

    10. 分布式

    分布式爬虫系统
    这里写图片描述

    11. 应对网站的反爬技术

    11.1网站如何发现爬虫

    • 单一IP非常规的访问频次
    • 单一IP非常规的数据流量
    • 大量重复简单的网站浏览行为
    • 只下载网页,没有后续的js,css请求
    • 通过一些陷阱来发现爬虫,例如一些用过css对用户隐藏的链接,只有爬虫才会访问

    11.2如何应对反爬技术

    • 多主机策略
    • 降低访问频次
    • 变换IP或者代理服务器
    • 把爬虫放到访问频繁的主站IP的子网下
    • 频繁改变自己的User-Agent
    • 探测陷阱
    • 如果使用规则来批量爬取,需要对规则进行组合
    • 如果可能,按照Robots.txt定义的行为去文明抓取
    • 模拟登陆

    参考资料:小象学院《分布式爬虫实战》

    展开全文
  • 网络爬虫,也称为网页采集和数据抓取,主要是指通过超文本传输协议(HTTP)或网络浏览器获取网页上有用的数据。 阅读更多:网络爬虫:它是如何开始的并将如何发展 2.网络爬虫是否合法? 网络爬虫本身并不违法,因为...


    网络爬虫是一个大家经常谈论的流行词,对许多外行人来说仍然很神秘。作为网络爬虫服务提供商,我们决定整理一些常见的网络爬虫问题和答案,以帮助解开这个谜团。

     
    1.什么是网络爬虫?

    网络爬虫,也称为网页采集和数据抓取,主要是指通过超文本传输协议(HTTP)或网络浏览器获取网页上有用的数据。 

    阅读更多:  网络爬虫:它是如何开始的并将如何发展

     
    2.网络爬虫是否合法?

    网络爬虫本身并不违法,因为它只是一种更容易收集数据的工具。但是,如果你用它来窃取非公开信息,或目标网站严格禁止在未经事先许前提下,爬取并使用其数据,那么你将可能触犯法律。强烈建议在抓取之前仔细阅读网站的爬虫条款和条件。

     

    3.最好的网络爬虫工具是什么?

    选择哪种抓取工具取决于网站的性质及其复杂性。只要该工具可以帮助你,以可接受的成本快速稳定的获取数据,那么该工具就会合适的。

    阅读更多:2019年最佳数据抓取工具


    4.我可以抓取LinkedIn或Facebook吗?

    不幸的是,这两个网站都通过robots.txt协议阻止自动网络爬虫。LinkedIn与窃取其数据的公司之间的法律纠纷一直是一个热门话题。不过,如果你只获取robots协议中允许的公开的数据,则可以抓取这两个网站。

    阅读更多:抓取LinkedIn上的帖子


    5.网页数据抓取的用途是什么?

    网页数据抓取旨在收集数据,以便可以应用于任何需要数据的行业。它主要用于市场研究,价格监控,人力资本优化,潜在客户寻找以及许多其他领域。

    阅读更多:数据洞察力:54个使用Web爬虫的行业
     

    6.我可以从全网中抓取数据吗?

    许多人认为网络爬虫可1次就从全网或至少数十万个网站中抓取数据。这在实践中是行不通的。由于各个网站的页面结构并不通用,因此,网络爬虫无法一次性与所有页面同时进行交互。


    7.网络爬虫是数据挖掘吗?

    网络爬虫和数据挖掘是两个不同的概念。 网络爬虫是收集原始数据,但数据挖掘是在大型数据集合中分析建模以为业务所用的过程。
     

    8.怎样避免抓一个网站被封掉?

    如果你抓的太多,许多网站都会封锁你的访问。为了避免被网站拒绝,你需要使爬虫尽量模拟人的访问网站的真实行为。例如,在两个请求之间增加延迟时间,使用代理IP等。

     
    9.在抓取网页时能否解决验证码问题?

    验证码曾经是网络爬虫的噩梦,但现在可以轻松解决。许多网络爬虫工具都可以在抓取过程中自动打码。并且,许多打码工具都可以与采集系统集成。


    10.我可以重新发布通过网络爬虫抓取的内容吗?

    尽管可以从允许使用爬虫机器的网站上抓取文本内容,但你仍然需要以不侵犯发布者版权的方式使用这些数据。


    11. web scraping和web crawling什么区别?

    web scrapingweb crawling 是两个相关的概念。web scraping 是我们一直在提的从特定网站获取数据的过程;而 web crawling 是系统性地浏览整个万维网,通常用于网络索引,如谷歌搜索引擎。

     
    12.什么是robots.txt文件?

    Robots.txt 是一个文本文件,它告诉采集器、机器人或爬虫一个网站是否可以采集或者应该按网页所有者的要求采集。理解robots.txt 文件对于防止在网页抓取时被封锁非常重要。
     

    13. 我可以采集需要登录网页后才能查看的数据吗?

    可以的,如果你在网站上有一个可用账号,你可以很轻松地登录网页后抓取数据。登录后的抓取过程与正常的抓取过程类似。

    阅读更多:抓取登录后可见的数据

     

    14. 如何从动态页面中抓取内容?

    动态网站会频繁更新数据。例如,Twitter上总会有最新帖子。要抓取这样的网站,和抓取其他网站的流程是一样的,但是你需要让采集器以一定的频率访问网站,不断地获取更新的数据。比如设置云上定时采集。

    阅读更多:在云端运行的定时采集爬虫

     

    15. 网页抓取工具可以直接从网站下载文件吗?

    是的,有很多爬虫工具可以直接在网站上下载文件,并在抓取文本信息时保存到Dropbox或其他服务器上。

    展开全文
  • 答:HTML是超文本标记语言,一种基于web网页设计的语言,而XHTML是基于XML的标记语言。而什么是XML呢?可以将XML理解为一个纯文本,你可以定义任意标签,主要用来记录某个信息,需要自己编写软件或程序才能传送读取...
  • 1.说说你对标签语义化的理解? a. 去掉或者丢失样式的时候能够让页面呈现出清晰的结构 b. 有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签...可以容纳内联元素(文本元素),与其他
  • 5.1.5 网页抓取信息 69 5.2 真正的困难 73 5.2.1 下载原始内容 73 5.2.2 表单、对话框和新建窗口 73 5.2.3 Flash 74 5.3 不利情况的解决办法 75 5.4 小结 75 第6章 检测撒谎者以及相互矛盾网上评论的困惑 76 ...
  • 网页抓取帮助(HttpWebRequestHelper.cs) Net(NetworkUtil.cs) IE代理设置辅助类(ProxyHelper.cs) ----------Winform-------------- 跨线程的控件安全访问方式(CallCtrlWithThreadSafety.cs) CheckBoxList...
  • 网页抓取频率和快照的更新频率是两个不同的概念,蜘蛛池博客小编整理发布。被百度收录的网站,蜘蛛会根据该站点内容更新的频率,频繁的来站点检查是否有新的网页生成,蜘蛛的抓取频率会和网站产生新内容的速度相符...
  • 百度爬虫它是一个自动的程序,对内容的抓取路径与蜘蛛丝类似,通过网页的锚文本链接进行爬行抓取,所以我们也称为百度蜘蛛,它抓取网页中的内容、图片、文字等,抓取后对其分类和整理,所以网站必需有蜘蛛来访并被...
  • 2、文本抓取,示范内容:这(example@123.com)是一段带(example#321.com)有 E-mail 的文(example*123.net)本!可以自动整理文本中的邮箱并输出,自动合并多个相同邮箱等,贴入一段文字即可!现已支持已 ~!@#¥...
  • 有次要下载近三年的WSN相关会议,手动下太麻烦,写了个程序下载,在会议的网站上抓取超链接,同时将超链接中的文本整理成论文的名字,存成网页格式 推荐个网站,点击打开链接,论文是按会议,年份分开整理的,超链接...
  • 首先抓取网页分析网页然后在文本中判断短语是否为计算机专业的术语最后把获得的术语保存到一个excle文件中然后整理合并同义词上下位词和注释专业程序代写c++程序代写 转载于:...
  • 13-1 分析抓取目的确定抓取页面   爬取熊猫TV某个分类下面主播的人气排行 分析网站结构   13-2 整理爬虫常规思路   F12查看HTML信息,Ctrl+Shift+C鼠标选取后找到对应的HTML。 文本分析并提取信息——...
  • 整理这个文档的初衷是自己开始学习的时候没有找到好的教程和文本资料,自己整理一份这样的资料希望能对小伙伴有帮助 什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页...
  • 整理这个文档的初衷是自己开始学习的时候没有找到好的教程和文本资料,自己整理一份这样的资料希望能对小伙伴有帮助 什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者...
  • AquaSetup V13.0.14

    2009-02-04 17:16:52
    我立即下载试了一下,的确非常棒,能快速的抓取屏幕上任何文本型文字,有了这个软件,那些网页用不起右键复制的它都可以帮你办到哦,很好玩的! Ctrl+Shift+鼠标左键拖动出一个捕捉的范围松开鼠标左键,然后会自动有一...
  • python爬虫系列(二)

    2018-08-10 15:28:17
    整理这个文档的初衷是自己开始学习的时候没有找到好的教程和文本资料,自己整理一份这样的资料希望能对小伙伴有帮助 &nbsp; 什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的...
  • 使用Python进行网页抓取,并使用R进行探索性分析。 Web抓取是在Beautiful Soup( Python )中完成的,并使用dplyr进行了进一步dplyr并使用ggplot2可视化。 该项目还做出了开源贡献(即带有旋转文本的圆形树状图)...
  • 最近开始整理python的...爬虫:就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Se...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

网页文本抓取整理