抓取小程序

前言 ,想利用小程序导航页面来提升网站的流量,找到  www.xcxdh666.com  该小程序导航网站。

分析网页

1 发现网站其实也是用异步分页请求加载数据的  ,所以根本用不着xpath  解析html,直接分析其请求url

2点击加载更多找到请求,发现其实就 pageNum ,cagegory 两个参数

3所以直接请求url    带入参数,分析起返回json结果

编写代码

1 首先建立接收类型


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public class XcxApplet

   {

       public int id { getset; }

       public string categoryName { getset; }

       public string name { getset; }

       public string saomaUrl { getset; }

       public string sum { getset; }

       public string logoUrl { getset; }

   }

   public class Result

   {

       public List<XcxApplet> dataList { getset; }

       public string category { getset; }

       public int  status { getset; }

       public int pageNum { getset; }

   }

  

2  封装请求页面方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

public static string GetPostPage(this string posturl, string postData)

         {

             Encoding encoding = Encoding.UTF8;

             byte[] data = null;

             if (!string.IsNullOrEmpty(postData)) data = encoding.GetBytes(postData);

             try

             {

                 // 设置参数

                 var request = WebRequest.Create(posturl) as HttpWebRequest;

                 if (request == nullreturn string.Empty;

                 var cookieContainer = new CookieContainer();

                 request.CookieContainer = cookieContainer;

                 request.AllowAutoRedirect = true;

                 request.Method = "POST";

                 request.ContentType = "application/x-www-form-urlencoded";

                 if (data != null)

                 {

                     request.ContentLength = data.Length;

                     Stream outstream = request.GetRequestStream();

                     outstream.Write(data, 0, data.Length);

                     outstream.Close();

                 }

                 //发送请求并获取相应回应数据

                 var response = request.GetResponse() as HttpWebResponse;

                 if (response == nullreturn string.Empty;

                 //直到request.GetResponse()程序才开始向目标网页发送Post请求

                 Stream instream = response.GetResponseStream();

                 if (instream == nullreturn string.Empty;

                 var sr = new StreamReader(instream, encoding);

                 //返回结果网页(html)代码

                 string content = sr.ReadToEnd();

                 string err = string.Empty;

                 //Response.Write(content);

                 return content;

             }

             catch (Exception ex)

             {

                 string err = ex.Message;

                 return string.Empty;

             }

         }

  3  图片url处理   思路就是要将其返回的url 请求下载到本地或者上传到自己对应的图片服务器,

我这里是用七牛云存储img的 ,这里你可以改成下载到本地 返回本地的url就好。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

public string  QiniuUplod(string imgurl)

        {

              

            var accessKey = "你的accesskey";

            var secretKey = "你的secretkey";

            // 生成(上传)凭证时需要使用此Mac

            // 这个示例单独使用了一个Settings类,其中包含AccessKey和SecretKey

            // 实际应用中,请自行设置您的AccessKey和SecretKey

            Mac mac = new Mac(accessKey, secretKey);

            string bucket = "siyouku";

            string saveKey = imgurl.Substring(imgurl.LastIndexOf(‘/‘)+1,imgurl.Length- imgurl.LastIndexOf(‘/‘)-1);

            // 使用前请确保AK和BUCKET正确,否则此函数会抛出异常(比如code612/631等错误)

            Qiniu.Common.Config.AutoZone(accessKey, bucket, false);

            // 上传策略,参见

            // https://developer.qiniu.com/kodo/manual/put-policy

            PutPolicy putPolicy = new PutPolicy();

            // 如果需要设置为"覆盖"上传(如果云端已有同名文件则覆盖),请使用 SCOPE = "BUCKET:KEY"

             putPolicy.Scope = bucket + ":" + saveKey;

            putPolicy.Scope = bucket;

            // 上传策略有效期(对应于生成的凭证的有效期)         

            putPolicy.SetExpires(3600);

            // 上传到云端多少天后自动删除该文件,如果不设置(即保持默认默认)则不删除

            //putPolicy.DeleteAfterDays = 1;

            // 生成上传凭证,参见

            // https://developer.qiniu.com/kodo/manual/upload-token           

            string jstr = putPolicy.ToJsonString();

            string token = Auth.CreateUploadToken(mac, jstr);

            try

            {

                

                var wReq = System.Net.WebRequest.Create(imgurl) as System.Net.HttpWebRequest;

                var resp = wReq.GetResponse() as System.Net.HttpWebResponse;

                using (var stream = resp.GetResponseStream())

                {

                    // 请不要使用UploadManager的UploadStream方法,因为此流不支持查找(无法获取Stream.Length)

                    // 请使用FormUploader或者ResumableUploader的UploadStream方法

                    FormUploader fu = new FormUploader();

                    var result = fu.UploadStream(stream, saveKey, token);

                    var x = Newtonsoft.Json.JsonConvert.DeserializeObject<QiniuResult>(result.Text);

                    return $"http://img.siyouku.cn/{x.key}";

                }

            }

            catch (Exception ex)

            {

                return "";

            }

 

        }

  

4 最后是请求主体方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

public ActionResult GetxcxList()

        {

            Stopwatch watch = new Stopwatch();//监控抓取耗时

            watch.Start();

            //https://www.xcxdh666.com/pageList.htm?pageNum=0  dataList

            var result = new Result();

            for (int j = 0; j <54; j++)

            {

                string url =

                    $"https://www.xcxdh666.com/pageList.htm?pageNum={j}";

                var str = url.GetPostPage(null);//HttpWebRequest 请求页面

                if (str != null)

                {

                    result = str.JsonConvert<Result>();  //string   的序列化扩展方法

                }

                result.dataList.ForEach(i =>

                {

                    if (!Db.Applet.Any(x => x.Name == i.name))//判断重复插入

                    {

                        var x = new Applet()

                        {

                            CategoryName = string.IsNullOrEmpty(i.categoryName) ? "其它" : i.categoryName,

                            Name = i.name,

                            SaomiaoUrl = QiniuUplod($"http://img.xcxdh666.com/wxappnav/{i.saomaUrl}"),

                            Summary = i.sum,

                            LogoUrl = QiniuUplod($"http://img.xcxdh666.com/wxappnav/{i.logoUrl}"),

                            SortNum = j,

                            CreateUser = "wenqing",

                            CreateTime = DateTime.Now

                        };

                        Db.Applet.Add(x);

                    }

                });

                Db.SaveChanges();

            }

            watch.Stop();

            return Content("爬取完成!本次请求总共耗时:"+ watch.ElapsedMilliseconds);

        }

    }

  

ok  到这里就全部抓取完成

这里附上 展示地址  http://siyouku.cn/Applet

时间: 2024-11-05 22:41:53

抓取小程序的相关文章

简单抓取小程序大全,并展示

前言,想利用小程序导航页面来提升网站的流量,找到www.xcxdh666.com该小程序导航网站. 分析网页       1发现网站其实也是用异步分页请求加载数据的,所以根本用不着xpath解析html,直接分析其请求URL       2点击加载更多找到请求,发现其实就是pageNum,cagegory两个参数       3所以直接请求URL,带入参数,分析起返回json结果 编写代码         1首先建立接收类型             public class XcxApplet

百度收录链接抓取小程序

set_time_limit(0); header("Content-type:text/html;charset=utf-8"); $updatePoint = date("Y-m-d", time()); $patMD = date("m-d", time()); $xmlDatas = ''; for($i=0;$i<76;$i++) { $page = $i*10; $conts = file_get_contents("

[Gevent]gevent 网络抓取小测试

早就听说gevent基于事件的异步处理能力 效率多么高,一直在项目中也很少用到,今天先来没事就学习了些简单的用法. 有个官方的教程写的很不错 中文版的地址为:http://xlambda.com/gevent-tutorial/ 学习gevent很不错的资料. 具体的理论这里不怎么说了,只是有些了解,具体的原理还不能解释的很清楚.不过协程这种概念在golang里面很多. 写了一个访问网络,使用同步操作,gevent 和 多线程对比的例子. #!/usr/bin/python # -*- codi

网页抓取小工具(IE法)

网页抓取小工具(IE法)-- 吴姐 http://club.excelhome.net/thread-1095707-1-1.html 用IE提取网页资料的好处在于:所见即所得,网页上能看到的信息一般都能获取. 本工具功能不多,主要是便于提取网页上展示的信息所在元素的代码.希望能对大家有点小帮助. 网页抓取小工具.rar (22.91 KB, 下载次数: 2426) 本工具使用方法: 1.在B1内输入网址,可以是已打开的网页,也可以是未打开的 2.A2和B2的内容不要更改,第二行的其他单元格可以

pylibcurl之https搜索引擎之网络数据抓取小例子,302moved?google搜索引擎不让你抓搜索结果??ok,此文问题通通解决

前提:操作平台-WIN7 一.首先你得python,我安装的是python2.7.9 二.其次,你得安装pyLibCurl,安装方式:http://pycurl.sourceforge.net/ 三.最后,你得编写测试用例test.py:(当然,从代码中可以看出你电脑得有E盘,否则改一下代码,然后我抓取的数据是google一下test的数据) #! /usr/bin/env python # -*- coding: utf-8 -*- # vi:ts=4:et import sys import

21天打造分布式爬虫-Crawl爬取小程序社区(八)

8.1.Crawl的用法实战 新建项目 scrapy startproject wxapp scrapy genspider -t crawl wxapp_spider "wxapp-union.com" wxapp_spider.py # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider,

NodeJS抓取Web页面的编码问题

最近在做毕设需要用到的爬虫系统,页面抓取这一块使用的是NodeJS语言,在最开始写的页面抓取的程序中,针对gb2312编码的页面保存完后显示的是乱码,开始认为在用Java读取文件时进行一个编码转换工作就可以解决了,但是试了半天,编码只会越来越慢,后来猜想,NodeJS请求到的页面的Body传输过来的是二进制的流信息,如果采用错误的编码方式对二进制信息进行解码,那么得到的结果坑定是错误的,再将这种结果保存到文件中,结果肯定还是错的,所以,通过上述的方法,不可能得到正确的结果. 后来的解决方法是,在

网页数据抓取(B/S)

C# 抓取网页内容(转) 1.抓取一般内容 需要三个类:WebRequest.WebResponse.StreamReader 所需命名空间:System.Net.System.IO 核心代码: 1 WebRequest request = WebRequest.Create("http://www.cftea.com/"); 2 WebResponse response = request.GetResponse(); 3 StreamReader reader = new Stre

C# .net 抓取网页内容

ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 1.抓取一般内容 需要三个类:WebRequest.WebResponse.StreamReader 所需命名空间:System.Net.System.IO 核心代码: WebRequest 类的 Create 为静态方法,参数为要抓取的网页的网址: Encoding 指定编码,Encoding 中有属性 ASCII.UTF32.UTF8 等全球通用的编码,但没有 gb2312 这个编码属性,所以我们使