需求

爬取百度搜索某个关键字对应的前一百个网址。

实现方式

VS2017 + Chrome

.NET Framework + C# + Selenium(浏览器自动化测试框架)

环境准备

创建控制台应用程序,通过NuGet添加对Selenium的引用

这里因为我用的Google浏览器,所以添加这两个的引用。

代码输出

  1. static void GrabUrlByKeyWord(string keyWord)
  2. {
  3. //创建chrome驱动程序
  4. IWebDriver webDriver = new ChromeDriver();
  5. //跳至百度
  6. webDriver.Navigate().GoToUrl("https://www.baidu.com");
  7. //找到页面上的搜索框 输入关键字
  8. webDriver.FindElement(By.Id("kw")).SendKeys(keyWord);
  9. //点击搜索按钮
  10. webDriver.FindElement(By.Id("su")).Click();
  11. }

运行看一下效果先

  1. static void Main(string[] args)
  2. {
  3. GrabUrlByKeyWord("香香瓜子");
  4. }

是不是感觉太简单了,这么快就来到目标页面了(这么想就太天真了。。)

F12,观察发现搜索结果都在一个id为content_left的div中,进一步解刨

百度对目标做了中转,最关键的是它对目标url做了加密。。。

那么?问题来了,我们怎么获取到目标真实的网址呢?

当然,方法有很多:

①可以通过Selenium模拟真实操作,每个结果都点进去,获取地址栏的网址;(这样效率是不是太低了。。。)

②解密;(目前我还没有找到解密方法。。。)

③后台通过HttpClient发送请求,获取url;

......

......

......

把想说的思想总结一下:

使用HttpClient一个一个去请求的地址来获取真实地址的话,这样效率很低,

使用PLINQ并行查询 或 多线程 的话,效率变高了,但是它的执行顺序是不定的,

我们需要的结果又是排名的顺序,这时候可以把操作对象封装成不依赖顺序的model,

例如给model加一个rank排名属性,后期可以根据该属性进行处理。

贴一段来自Microsoft的文本:

虽然可以指示 PLINQ 暂留任何源序列的顺序,但这会对性能产生不利影响。 最佳做法是,尽量将查询的结构设计为不依赖顺序暂留。

C#+Selenium抓取百度搜索结果前100网址的更多相关文章

  1. selenium-java web自动化测试工具抓取百度搜索结果实例

    selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度的搜索关键字结果非常容易抓长尾关键词,根据热门关键词去抓更多内容可以用抓google,百度的这种内容容易给屏蔽,用这 ...

  2. PHP网络爬虫实践:抓取百度搜索结果,并分析数据结构

    百度的搜索引擎有反爬虫机制,我先直接用guzzle试试水.代码如下: <?php /** * Created by Benjiemin * Date: 2020/3/5 * Time: 14:5 ...

  3. 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本. 在写这个脚本的过程中遇到了很多的问题,下面会一一道来. ps:我并没有系统地学习过pyth ...

  4. python爬取百度搜索结果ur汇总

    写了两篇之后,我觉得关于爬虫,重点还是分析过程 分析些什么呢: 1)首先明确自己要爬取的目标 比如这次我们需要爬取的是使用百度搜索之后所有出来的url结果 2)分析手动进行的获取目标的过程,以便以程序 ...

  5. 关于python抓取google搜索结果的若干问题

    关于python抓取google搜索结果的若干问题     前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童 ...

  6. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  7. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

  8. selenium抓取动态网页数据

    1.selenium抓取动态网页数据基础介绍 1.1 什么是AJAX AJAX(Asynchronouse JavaScript And XML:异步JavaScript和XML)通过在后台与服务器进 ...

  9. Python抓取百度百科数据

    前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...

随机推荐

  1. redis 主从复制和哨兵模式(二)

    Redis 主从复制 为了分担单机 redis 的数据服务压力,需要进行读写分离,所以搭建 redis 的主从结构,主节点负责写,从节点负责读,主节点定期把数据同步到从节点. 配置主从 # 配置文件中 ...

  2. Regex分组与Pattern正则表达式对象

    1.正则规则:        1.String  regex  =  "[1-9]"          表示单个字符的取值范围是 1~9,注意是单个字符的取值范围        2 ...

  3. Spring MVC-从零开始-view-向页面传递data(ModelAndView与ModelMap的区别)

    1.ModelMap的用法 package com.jt; import org.springframework.stereotype.Controller; import org.springfra ...

  4. Git很麻烦?不存在的!掌握这几招就够了

    废话不多说,下面直接开始了! 查看原文 确保代码库是最新的,先用这条命令把你的代码拉取到本地 git clone -- 修改完代码后,按顺序执行下面四个命令 git pull git add * /r ...

  5. 一起来学Java注解(Annotation)

    目录 一. 什么是Annotation 二. Annotation的作用 2.1 编译器使用到的注解 2.2 .class文件使用到的注解 2.3 运行期读取的注解 三. 定义Annotation 3 ...

  6. element取表格对应id数据

    <el-button size="mini" type="danger" @click="editor(scope.row)"> ...

  7. 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).

    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 2017年02 ...

  8. Python3行代码之——截图工具

    最近工作需要个定时截图的小工具,用Python实现比较急直接上代码 from PIL import ImageGrab im = ImageGrab.grab() im.save(addr,'jpeg ...

  9. MongoDB 学习笔记之 地理空间索引入门

    地理空间索引: 地理空间索引,可用于处理基于地理位置的查询. Point:用于指定所在的具体位置,我们以restaurants为例: db.restaurants.insert({name: &quo ...

  10. Android_布局

    <该文章参考各大博客以及书籍总结而来,如有问题欢迎指出^ ^> 一.五大传统布局+新布局 线性布局——LinearLayout 相对布局——RelativeLayout 帧布局——Fram ...