接下来一段时间,我会花些时间研究C#玩转爬虫的方法及其实践。
话不多说,开始吧~
一般来说:
设计并实现一个爬虫的步骤是:
模拟登录 -> 模拟发送request请求 -> 取回response数据 -> 提取所需信息并将其进行重新组织 -> 存入DB或文件中 -> 展示
当然,有时还需要适当地应对所抓取目标站点的反爬虫策略,也就是大家常说的反反爬!
下文以抓取豆瓣音乐为例来具体说明:
比如,我们在豆瓣音乐中搜索"摇滚"后爬取相关内容,然后写入csv文件中。
目标网址是:
https://music.douban.com/tag/摇滚?start=0&type=T
抓取大概分为如下几个步骤:
获取页数
- 发请求
每一页中都可以看到总的页数,直接取第1页的就好。
byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T"); // utf-8, gb2312, gbk, utf-1...... string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer);
借助以上两行代码,就可以看到该网址Response的HTML字符串(debug时上面一行代码中html的值)为:
- 使用正则表达式匹配到页数
我们选用模式串 ">[0-9][0-9]{0,}" 进行匹配,由于下面的页码是从第一页算起的,选最大页数就是总页数。
相应的函数GetTotalCount如下:
private static int GetTotalCount(System.Net.WebClient webclient, int startIdx) { //html下载 /* https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=0&type=T */ byte[] buffer = webclient.DownloadData("https://music.douban.com/tag/%E6%91%87%E6%BB%9A?start=" + startIdx + "&type=T"); // utf-8, gb2312, gbk, utf-1...... string html = System.Text.Encoding.GetEncoding("utf-8").GetString(buffer); MatchCollection pageCount_matches = new Regex(">[0-9][0-9]{0,}").Matches(html); if (pageCount_matches.Count == 0) return 0; string tempPageNum = pageCount_matches[pageCount_matches.Count - 1].Value; int.TryParse(tempPageNum.Replace("