【yzc999亚洲城】爬取外国招投标网站

序言:筹划做一当中中草药材价格查询的成效,但刚伊始一点多少都未有靠自个儿找新闻录入的话很辛勤的,所以唯有先到任何网址抓取存到数据库再开头做那一个了。

采纳HtmlAgilityPack爬取网址信息并蕴藏到mysql,htmlagilitypack

前言:筹划做3当中药价格查询的效益,但刚先导一点数码都未有靠本身找新闻录入的话很劳累的,所以唯有先到其它网址抓取存到数据库再起来做那一个了。

HtmlAgilityPack在c#里应该多多少人用吗,简单又有力。从前也用它做过多少个爬取音信的小工具。可是很久了源代码都未有了,都忘了怎么用了,这一次也是一点一点找材质慢慢做出来的!

yzc999亚洲城,(可是最劳累的是将数据存到mysql,.net数据库笔者直接用的都是mssql,所以率先次做连接mysql遭受了好多标题。)

1、使用HtmlAgilityPack

  • 下载HtmlAgilityPack类库,并援引到你的种类

  小编这里运用的调控台项目

yzc999亚洲城 1

类型增加引用

yzc999亚洲城 2

代码里拉长引用


 

二、分析网页

  • 网页地址:

    首先看每一页的url变化,阅览后开采那几个极粗略:

    第一页正是:一-0-0要么1-0-0-壹表示第一页

    第二页正是:一-0-0-2二次类推

  • 接下来再分析他的源代码yzc999亚洲城 3

很料定那1页的数额都位居了ul标签里了,而且还有类名:<ul
class=”priceTableRows”>,

下一场再看下ul下的li标签,li标签里的html写的也都一样,然后就能够开始写代码抓取了。

yzc999亚洲城 4

三、抓取新闻

  • 先是新建二个类公事,来囤积抓取的音信。因为自个儿是一直存到数据库用的是ado.net实体数据模型生成的文书。
  • 上边是ado.net实体数据模型生成的文件:

 

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码已从模板生成。
//
//     手动更改此文件可能导致应用程序出现意外的行为。
//     如果重新生成代码,将覆盖对此文件的手动更改。
// </auto-generated>
//------------------------------------------------------------------------------

namespace 测试项目1
{
    using System;
    using System.Collections.Generic;

    public partial class C33hao_price
    {
        public long ID { get; set; }
        public string Name { get; set; }
        public string Guige { get; set; }
        public string Shichang { get; set; }
        public decimal Price { get; set; }
        public string Zoushi { get; set; }
        public decimal Zhouzd { get; set; }
        public decimal Yuezd { get; set; }
        public decimal Nianzd { get; set; }
        public int editDate { get; set; }
        public string other { get; set; }
    }
}

【yzc999亚洲城】爬取外国招投标网站。 

  • 下边那些是刚起先测试存到本地时写的类:
  • using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 测试项目1
    {
        public class Product
        {
            /// <summary>
            /// 品名
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 规格
            /// </summary>
            public string Guige { get; set; }
            /// <summary>
            /// 市场
            /// </summary>
            public string Shichang { get; set; }
            /// <summary>
            /// 最新价格
            /// </summary>
            public string Price { get; set; }
            /// <summary>
            /// 走势
            /// </summary>
            public string Zoushi { get; set; }
            /// <summary>
            /// 周涨跌
            /// </summary>
            public string Zhouzd { get; set; }
            /// <summary>
            /// 月涨跌
            /// </summary>
            public string Yuezd { get; set; }
            /// <summary>
            /// 年涨跌
            /// </summary>
            public string Nianzt { get; set; }
    
        }
    }
    

    上边是重中之重的拍卖代码

  • using System;

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using HtmlAgilityPack;
    using System.IO;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    
    namespace 测试项目1
    {
        public class Program
        {
            /// <summary>
            /// 本地测试信息类
            /// </summary>
            static List<Product> ProductList = new List<Product>();
            /// <summary>
            /// 数据库生成的信息类
            /// </summary>
            static List<C33hao_price> PriceList = new List<C33hao_price>();
            public static void Main(string[] args)
            {
    
                int start = 1;//开始页数
                int end = 10;//结束页数
                Console.WriteLine("请输入开始和结束页数例如1-100,默认为1-10");
                string index = Console.ReadLine();//获取用户输入的页数
    
                if(index != "")
                {
                    //分割页数
                    string[] stt = index.Split('-');
                    start = Int32.Parse(stt[0]);
                    end = Int32.Parse(stt[1]);
                }
                //循环抓取
                for(int i = start; i<= end; i++)
                {
                    string url = string.Format("http://www.zyctd.com/jiage/1-0-0-{0}.html", i);
    
                HtmlWeb web = new HtmlWeb();
                HtmlDocument doc = web.Load(url);//获取网页

                HtmlNode node = doc.DocumentNode;
                string xpathstring = "//ul[@class='priceTableRows']/li";//路径  
                HtmlNodeCollection aa = node.SelectNodes(xpathstring);//获取每一页ul下的所有li标签里的html
                    if (aa == null)
                    {
                        Console.WriteLine("出错:当前页为{0}", i.ToString());
                        continue;
                    }
                foreach(var item in aa)
                {
                    //处理li标签信息添加到集合
                    string cc = item.InnerHtml;
                    test(cc);

                }
                }
                //写入json并存到本地
                //string path = "json/test.json";
                //using(StreamWriter sw = new StreamWriter(path))
                //{
                //    try
                //    {
                //        JsonSerializer serializer = new JsonSerializer();
                //        serializer.Converters.Add(new JavaScriptDateTimeConverter());
                //        serializer.NullValueHandling = NullValueHandling.Ignore;
                //        //构建Json.net的写入流
                //        JsonWriter writer = new JsonTextWriter(sw);
                //        //把模型数据序列化并写入Json.net的JsonWriter流中  
                //        serializer.Serialize(writer,ProductList);
                //        //ser.Serialize(writer, ht);  
                //        writer.Close();
                //        sw.Close();
                //    }
                //    catch (Exception ex)
                //    {
                //        string error = ex.Message.ToString();
                //        Console.WriteLine(error);
                //    }
                //}
                int count = PriceList.Count();//抓取到的信息条数
                Console.WriteLine("获取信息{0}条", count);
                Console.WriteLine("开始添加到数据库");
                Insert();//插入到数据库
                Console.WriteLine("数据添加完毕");
                Console.ReadLine();
            }
            /// <summary>
            /// 处理信息并添加到集合中
            /// </summary>
            /// <param name="str">li标签的html内容</param>
            static void test(string str)
            {
                //Product product = new Product();
                C33hao_price Price = new C33hao_price();

                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(str);
                HtmlNode node = doc.DocumentNode;
                //获取药材名称
                string namepath = "//span[@class='w1']/a[1]";//名称路径
                HtmlNodeCollection DomNode = node.SelectNodes(namepath);//根据路径获取内容
                //product.Name = DomNode[0].InnerText;
                Price.Name = DomNode[0].InnerText;//将内容添加到对象中
                //获取规格
                string GuigePath = "//span[@class='w2']/a[1]";
                DomNode = node.SelectNodes(GuigePath);
                //product
                Price.Guige = DomNode[0].InnerText;
                //获取市场名称
                string adsPath = "//span[@class='w9']";
                DomNode = node.SelectNodes(adsPath);
                Price.Shichang = DomNode[0].InnerText;
                //获取最新价格
                string pricePath = "//span[@class='w3']";
                DomNode = node.SelectNodes(pricePath);
                Price.Price = decimal.Parse(DomNode[0].InnerText);
                //获取走势
                string zoushiPath = "//span[@class='w4']";
                DomNode = node.SelectNodes(zoushiPath);
                Price.Zoushi = DomNode[0].InnerText;
                //获取周涨跌
                string zhouzdPath = "//span[@class='w5']/em[1]";
                DomNode = node.SelectNodes(zhouzdPath);
                Price.Zhouzd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //获取月涨跌
                string yuezdPath = "//span[@class='w6']/em[1]";
                DomNode = node.SelectNodes(yuezdPath);
                Price.Yuezd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //获取年涨跌
                string nianzdPath = "//span[@class='w7']/em[1]";
                DomNode = node.SelectNodes(nianzdPath);
                Price.Nianzd = decimal.Parse(GetZD(DomNode[0].InnerText));
                //添加时间
                Price.editDate = Int32.Parse(GetTimeStamp());//转换为时间戳格式,方便php使用
                //ProductList.Add(product);
                PriceList.Add(Price);//添加到对象集合
            }

            //查询
            static void Query()
            {
                var context = new mallyobo360Entities();
                var member = from e in context.C33hao_member select e;
                foreach(var u in member)
                {
                    Console.WriteLine(u.member_name);
                    Console.WriteLine(u.member_mobile);
                }
                Console.ReadLine();
            }
            //插入
            static void Insert()
            {
                var context = new mallyobo360Entities();
                C33hao_price Price = new C33hao_price();
                int i = 0;
                foreach (C33hao_price item in PriceList)
                {
                    context.C33hao_price.Add(item);
                    context.SaveChanges();
                    i++;
                    Console.WriteLine("{0}/{1}", i, PriceList.Count);
                }
            }
            /// <summary>  
            /// 获取时间戳  
            /// </summary>  
            /// <returns></returns>  
            public static string GetTimeStamp()
            {
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                return Convert.ToInt64(ts.TotalSeconds).ToString();
            }
            /// <summary>
            /// 去除字符串中的百分比
            /// </summary>
            /// <param name="str">处理的字符串</param>
            /// <returns></returns>
            public static string GetZD(string str)
            {
                string st = str.Substring(0, str.Length - 1);
                return st;
            }

        }
    }
  • 如上代码首假设存到数据库,下边说下怎么存到本地。
  • 四、存款和储蓄到本地

  存款和储蓄到地头只要求把test方法里的Price对象改为Product类型,然后再add到ProductList集结里,再把注释的//写入json并存到地点//方法撤废注释就好了。

  • 5、连接到mysql

  待续。。。。。。。。。。

 

前言:希图做二当中药价格查询的意义,但刚初阶一点数量都不曾靠自个儿找音信录…

对象网址:https://www.tenders.gov.au
招来python专门的学问时,对方提供了一个爬虫项目,经过二日的查找,终于完结。本篇首要记录调节和测试进度中相见的壹部分坑。
一、模拟登陆
参考
http://www.jianshu.com/p/b7f41df6202d

HtmlAgilityPack在c#里应该多多个人用吗,轻便又有力。在此之前也用它做过多少个爬取音讯的小工具。可是很久了源代码都尚未了,都忘了怎么用了,这一次也是一点一点找质感稳步做出来的!

class TendersSpider(scrapy.Spider):
    name = 'tenders'
    allowed_domains = ['tenders.gov.au']
    def start_requests(self):  #构造出url入口
    return [Request("https://www.tenders.gov.au/?event=public.ATM.list", callback = self.post_login,meta = {'cookiejar' : 1})]
    def post_login(self, response):
        CSRFtoken =response.xpath('//input[@name="CSRFtoken"]/@value').extract()[0]
        print CSRFtoken
        return [FormRequest.from_response(response,
        meta = {'cookiejar' : response.meta['cookiejar']},
        headers = {'Referer':response.url,'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',},
        formdata = {'CSRFtoken': CSRFtoken,'pub-auth-username':'***********','pub-auth-password':'************','redirectString':'event=public.ATM.list'},
        callback = self.parse,
        dont_filter=True
        )]

(但是最费劲的是将数据存到mysql,.net数据库小编直接用的都以mssql,所以首先次做连接mysql碰到了重重难点。)

  1. 打开https://www.tenders.gov.au/?event=public.ATM.viewDocuments&atmuuid=808C2F36-C27E-6D6A-8661311F0BCBE16D亟待报到,通过抓包发掘登录时post提交表单到https://www.tenders.gov.au/?event=public.login,然后30二重定向到原来的网页。

    yzc999亚洲城 5

    抓包登六.jpg

    能够看来有记名账户和登入密码,redirectString为跳转前网页相对url。而CS奥迪Q3Ftoken,则在跳转前的页面源码中得以找到。
    二、由于经过为A页-login页-A页,为了防范scrapy自带的去重(自动过滤已经呼吁过的url),必要在模拟登六代码中加多dont_filter=True
    叁、模拟登6,传递’cookiejar’实现登入意况的传递。需求在settings中展开COOKIES_ENABLED = True,为了可以直观的阅览项目运维时cookie的更换,也得以开启COOKIES_DEBUG=True
    参考:http://blog.csdn.net/amaomao123/article/details/52511882

1、使用HtmlAgilityPack

贰、抓取详细情况页url

  • 下载HtmlAgilityPack类库,并引述到您的档案的次序

经过审核成分得以见见每1个订单【//div[@class=”boxEQH”]/div[@class=”row”]】的详情都在二个class=”box
boxW listInner”的DIV标签下,不过无法正确取到。

  作者这里运用的调控台项目

yzc999亚洲城 6

yzc999亚洲城 7

多少所在网页结构标签.jpg

系列增进引用

相应是class属性中包蕴空格的由来。唯有诚实的一流顶尖的同盟下来找到div[@class=”col-sm-8″]/div/div[6]/div/a/@href,就可以取到详细的情况页的url了。

yzc999亚洲城 8

三、抓取详细情形页数据

代码里增加引用

查阅详细情形页网页结构得以见到右侧每一行三个div。那样经过div[1]、div[2]。。下标来牢固取多少。


yzc999亚洲城 9

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图