需求:爬取https://www.u88.com/网站上所有餐饮和茶饮品牌公司数据;需要数据:公司、品牌、门店数,营业状态,所属地区,注册资金等等
步骤:
1、根据门店汇总页面地址获取所有加盟品牌详细页面地址
图一:
static void Main(string[] args)
{
for (int i = 1; i <= 7095; i++)
{
string url = string.Format("https://www.u88.com/canyin/p" + "{0}",i);
getHtmlData(url);
}
Console.ReadKey();
}
图二:
public static void getHtmlData(string urls)
{
var webGet = new HtmlWeb();
var document = webGet.Load(urls);
var div = document.DocumentNode.SelectNodes("//div[@class='item_pic']");
foreach (HtmlNode node in div)
{
var linkParser = new Regex(@"\b(?:https?://|www\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
//var rawString = "house home go www.monstermmorpg.com nice hospital http://www.monstermmorpg.com this is incorrect url http://www.monstermmorpg.commerged continue";
foreach (Match m in linkParser.Matches(node.InnerHtml))
{
getHtmlDetailData(m.Value);
}
}
}
图一中i代表当前为第几页,这个根据实际情况可修改。比如我茶饮数据只有八百多页,就只需要循环八百多次就可以。每页十条数据,通过筛选整个页面的控件之后,匹配出你需要的地址。
2、 通过获取到的品牌加盟地址获取到品牌的详细信息,并存入数据库
public static void getHtmlDetailData(string urls)
{
try
{
var webGet = new HtmlWeb();
var document = webGet.Load(urls);
var div = document.DocumentNode.SelectNodes("//div[@class='tit_pice']//li//span");
var brandname = document.DocumentNode.SelectNodes("//div[@class='pic_info']//h1")[0].InnerText;
var state = document.DocumentNode.SelectNodes("//div[@class='pic_com']//ul//li//em")[1].InnerText;
var companyname = document.DocumentNode.SelectNodes("//div[@class='pic_com']//div")[0].InnerText;
string area = div[0].InnerText;
string shopcount = div[1].InnerText;
StringBuilder sb = new StringBuilder();
sb.AppendFormat(@"INSERT INTO dbo.branddata ( brandname , companyname ,shopcount ,area ,state,type)VALUES ('{0}','{1}','{2}','{3}','{4}','{5}')
", brandname, companyname, shopcount, area, state, "餐饮");
WebCrawler.DataBaseSqlServer.ExcuteSql(sb.ToString());
Console.WriteLine(urls + "插入数据成功");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
最后获取到的结果:
这样七万多条餐饮类品牌加盟数据就获取到了。
重点:1、获取页面html 2、你要取得数据的控件部分 3、根据正则表达式获取控件部分的url地址 4、获取详细页面你需要的控件的值【选择对应class节点控件】 详细看代码