在上一篇爬虫博客中,我们讲述了应对IP访问限制的策略,即爬取代理IP并不断改变代理的方式。但是某些网站不仅在访问时做了限制,而且在返回网页时也做了巧妙的处理,比如在页面加载时调用js动态请求内容等。这种情况就不是简单的发出一个get请求可以爬取的了,这个时候可能就需要调用谷歌浏览器来实现爬取。本篇我们介绍通过C#调用谷歌浏览器来实现动态信息爬取。
普通爬虫遭遇的困境
假如我们要爬取某博客页面的详细信息,如标题,正文,作者,发布时间,阅读数等等。我们的第一思路是对这个页面的url发送一个get请求,对返回的网页报文通过xpath解析我们需要的信息。下面以一个博客详情页面为例:C#攻克反爬虫之代理IP爬取
class Program { static void Main(string[] args) { BasicalMothed("https://blog.csdn.net/Leaderxin/article/details/102764234"); Console.Read(); } static void BasicalMothed(string url) { HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest; if (req == null) return; HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); Encoding bin = Encoding.GetEncoding("UTF-8"); using (StreamReader sr = new StreamReader(resp.GetResponseStream(), bin)) { string str = sr.ReadToEnd(); Console.WriteLine(str.ToString()); return ; } } }
-
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
我们看一下打印出来的报文内容:

返回内容是乱码,明显某平台做了巧妙的处理,直接请求这个url是无法得到我们想要的报文的。还有一些场景,比如说某些网页里会有类似【更多】这样的按钮,点击后页面才会请求并渲染更多内容,这种也是无法通过直接请求该网页爬取的。
通过CHROMEDRIVER调用浏览器
下面我们通过C#调用chromedriver来控制浏览器访问我们要爬取的页面并实现爬取。首先通过nuget安装Selenium库:
注意如果安装Selenium时选择的是最新版的,需要将谷歌浏览器更新到最新,不然调用的时候会有异常

然后我们通过F12看下要爬取页面的结构,看看我们要爬取的信息在哪些标签里,结果如下:
标题在class ='title-article’的h1中,发布时间在class='time’的span中,博主在class='follow-nickName’的a标签中,阅读数在class='read-count’的span中,正文在id='article_content’的div中。

然后编码调用谷歌浏览器访问这个页面并取到我们指定元素:
static void SeleniumMothed(string url) { IWebDriver selenium = new ChromeDriver(); selenium.Navigate().GoToUrl(url); while (string.IsNullOrEmpty(selenium.Title)) { Task.Delay(100).GetAwaiter().GetResult(); } var title = selenium.FindElement(By.CssSelector("h1.title-article")).Text; var time = selenium.FindElement(By.CssSelector("span.time")).Text; var name = selenium.FindElement(By.CssSelector("a.follow-nickName")).Text; var nums = selenium.FindElement(By.CssSelector("span.read-count")).Text; var content = selenium.FindElement(By.Id("article_content")).Text; Console.WriteLine("标题:"+title); Console.WriteLine("发布时间:"+time); Console.WriteLine("博主名:"+name); Console.WriteLine("阅读数:"+nums); Console.WriteLine("正文:"+content); }
-
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
看下控制台打印结果:

可以看到,已经成功通过调用Chrome爬取到了我们想要的信息。Selenium能做到的事情还远不止如此,有兴趣的可以自己研究下。后面也会继续讲Selenium的一些其它用法。
上一篇:C#攻克反爬虫之代理IP爬取
非常感谢您有耐心的读完万广互联的这篇文章:"C#攻克反爬虫之谷歌浏览器调用",仅为提供更多信息供用户参考使用或为学习交流的方便。我们公司不仅提供:网站建设、网站制作、seo网站优化、网站推广、小程序开发、商城开发、快速排名、网页设计、建网站等服务,而且利用互联网营销手法,多平台,多样化进行品牌内容铺设,营造企业正面形象,诚挚为您服务,欢迎您的到来。