写点什么

兄弟要盘吗?

作者:为自己带盐
  • 2021 年 12 月 30 日
  • 本文字数:1888 字

    阅读完需:约 6 分钟

声明 &背景

这又是一篇早期搬运,早期写的东西,很一般,莫见怪~

就是想练习一下爬虫,对于一些基础的页面操作,获取页面元素等熟悉一下,然后找个肥羊练练手。我就瞄准了电影天堂。

注意,爬虫有风险,开爬需谨慎!

堆一下要用的工具

我这里主要用到的技术还是正则表达式,此外用 Nlog 做的日志输出,Polly 做的降级处理,AngleSharp 做的 dom 分析,redis 做的缓存,数据库用的是 sqlite,为的是可以随时把工具拷走。


代码

感觉也没啥可说的,之前的文章里写的闲话太多,都让我删掉了,直接上代码吧

/// <summary>/// 首先找到首页上的所有分类的入口,然后分别获取其地址/// </summary>public static void LetsStart(){    try    {        NLogHelper.Info("寻找网站入口...");        var htmlSourceCode = GetHtmlByUrl(baseurl);        var parser = new HtmlParser();        var document = parser.ParseDocument(htmlSourceCode);        var MoreList = document.QuerySelectorAll("em > a");        List<string> list = GetItemsHref(MoreList);        list.RemoveAt(2);//这个页面暂不解析        GetPageInfo(list, parser);    }    catch (Exception ex)    {        NLogHelper.Error("寻找入口出错:" + ex.Message);    }}/// <summary>/// 分别进入基础入口,并取得其所对应类别的电影数量,页数,每页的条数,并将这些信息,存入redis,避免每次都执行该步浪费时间/// </summary>static void GetPageInfo(List<string> urls, HtmlParser parser){    ISyncPolicy policy2 = Policy.Handle<Exception>()        .Retry(3);//重试3次    policy2.Execute(() =>    {        foreach (string url in urls)        {            #region            if (string.IsNullOrEmpty(redis.HashGet("pageinfo", url)))            {                var htmlSourceCode = GetHtmlByUrl(url);                var document = parser.ParseDocument(htmlSourceCode);                var pageInfo = document.QuerySelector(".co_content8 > .x");                string pattern_pagetotal = "(?<=页次:\\d\\/)\\d+";                string pattern_pageevery = "(?<=每页)\\d+";                string pattern_total = "(?<=总数)\\d+";                int page_total = Convert.ToInt32(Regex.Match(pageInfo.OuterHtml, pattern_pagetotal).Value);                int page_every = Convert.ToInt32(Regex.Match(pageInfo.OuterHtml, pattern_pageevery).Value);                int total = Convert.ToInt32(Regex.Match(pageInfo.OuterHtml, pattern_total).Value);                redis.HashSet("pageinfo", url, page_total + "|" + page_every + "|" + total);            }            #endregion        }        GetPageList(parser);    });}/// <summary>/// 逐页获取电影资源详情的链接/// </summary>static void GetPageList(HtmlParser parser){    var keys = redis.HashKeys("pageinfo");    try    {        foreach (var key in keys)        {            string url = key.ToString();            if (url.EndsWith("index.html"))                url = url.Replace("index.html", "");//去掉index.html            string pageinfo = redis.HashGet("pageinfo", key);            string[] parts = pageinfo.Split('|');            int pagetotal = Convert.ToInt32(parts[0]);            NLogHelper.Info("当前抓取地址:" + url + ",总页数:" + pagetotal + ",总条数" + Convert.ToInt32(parts[2]));            DoTask(parser, 0, Convert.ToInt32(parts[1]), pagetotal, url, Convert.ToInt32(parts[2]));        }    }    catch (Exception ex)    {        NLogHelper.Error("链接出错,error" + ex.Message);    }}/// <summary>/// 获取电影详情及资源链接,存入数据库/// </summary>static async Task GetPageInfo(DownloadParam param){    //这一段有点长,用了很多正则去匹配数据,就不分享了}
复制代码

上边的代码,对异常的处理有的是做的降级,有的还是 try catch,然后最后一段没有分享,主要是没有找到合适的优化方法,有大量的正则匹配在里面,就没分享。其实主要是这个经历很令我兴奋,所以就没忍住写个博客分享一下,此次分享代码相对粗鄙,各位见笑了,仓库地址:https://gitee.com/Tony_df/shaqiang.git。欢迎交流。在贴几张效果图。




发布于: 刚刚
用户头像

学着码代码,学着码人生。 2019.04.11 加入

狂奔的小码农

评论

发布
暂无评论
兄弟要盘吗?