目前很多大型网站在反爬虫时采取IP限制策略,限制同一个IP的请求频率及次数,或者同一IP在达到请求次数后强制登陆验证等。此时我们就需要用到代理IP来突破限制,此篇我们介绍通过DotnetSpider框架爬取西刺高匿代理IP的过程。
DotnetSpider框架简介
DotnetSpider是.net core开发的开源爬虫项目,基本开箱即用,对于爬虫各个部分的封装已经比较成熟,github下载地址:
https://github.com/dotnetcore/DotnetSpider
下载下来运行几个示例基本就知道如何使用了,示例在DotnetSpider.Sample解决方案下面,下面我们看一下例子中的CnblogsSpider。
CnblogsSpider在被调用时会执行Initialize()方法做一些爬虫配置的初始化,如下:
protected override async Task Initialize()
{
NewGuidId();
Depth = 3;
AddDataFlow(new ListNewsParser()).AddDataFlow(new ConsoleStorage());
await AddRequests("https://news.cnblogs.com/n/page/1/");
}
其中最重要的包含三部分,ListNewsParser,ConsoleStorage和最后的AddRequests。ListNewsParser是定义爬虫如何解析我们要爬取的网页以及返回怎样的一个结果,ConsoleStorage是定义爬虫如何保存我们爬取的结果,AddRequests则是指定爬虫爬取的目标url。下面我们分别看一下ListNewsParser和ConsoleStorage的代码。
class ListNewsParser : DataParser
{
public ListNewsParser()
{
Required = DataParserHelper.CheckIfRequiredByRegex("news\\.cnblogs\\.com/n/page");
// 如果你还想翻页则可以去掉注释
//FollowRequestQuerier =
// BuildFollowRequestQuerier(DataParserHelper.QueryFollowRequestsByXPath(".//div[@class='pager']"));
}
protected override Task<DataFlowResult> Parse(DataFlowContext context)
{
var news = context.Selectable.XPath(".//div[@class='news_block']").Nodes();
foreach (var item in news)
{
var title = item.Select(Selectors.XPath(