9.用python写网络爬虫,完结

   前言

这是python网络爬虫的最后一篇给大家做个总结,且看且珍惜把!

    截止到目前, 前几章本书介绍的爬虫技术都应用于一个定制网站,这样可以帮助我们更加专注于学习特定技巧。而在本章中,我们将分析几个真实网站,来看看这些技巧是如何应用的。首先我们使用 Google 演示一个真实的搜索表单,然后是依赖 JavaScript 的网站 Facebook, 接下来是典型的在线商店 Gap,最后是拥有地图接口的宝马官网由于这些都是活跃的网站,因此读者在阅读本书时这些网站存在已经发生变更的风险。不过这样也好,因为这些例子的目的是为了向你展示如何应用前面所学的技术,而不是展示如何抓取指定网站。当你选择运行某个示例时,首先需要检 查网站结构在示例编写后是否发生过改变,以及当前该网站的条款与条件是否禁止了爬虫。

9.1 Google 搜索引擎

    根据第4篇文章中 Alexa 的数据, google.com 是全世界最流行的网站之一,而且非常方便的是, 该网站结构简单,易于抓取。
     下图所示为 Google 搜索主页使用 Firebug 加载查看表单元素时的界面。
    可以看到搜索查询存储在输入参数q当中,然后表单提交到 action 属性设定的search路径。我们可以通过将 test 作为搜索条件提交给表单对其进行测试,此时会跳转到类似https://www.google. com/search?q=test&oq=test&es_sm=93&ie=UTF- 8 的URL中。确切的 URL 取决于你的浏览器和地理位置。此外,还需要注意的是,如果开启了 Google 实时,那么搜索结果会使用 AJAX 执行动态加载,而不再需要提交表单。虽然 URL 中包含了很多参数,但是只有用于查询的参数q是必需的。当URL为https://www.google.com/search?q=test时也能产生相同的结果,如下图 所示 。

 搜索结果的结构可以使用Firebug来检查,如下图所示。

 

    从下图中可以看出,搜索结果是以链接的形式出现的,并且其父元素是 class 为”主”的<h3>标签。想要抓取搜索结果,我们可以使用第2篇文章中介绍的css选择器。

 

 

    到目前为止,我们已经下载得到了 Google的搜索结果,并且使用lxrnl抽取出其中的链接。在上图中,我们发现链接中的真实网站URL之后还包含了一串附加参数,这些参数将用于跟踪点击下面是第一个链接。

 

     这里我们需要的内容是http://www.speedtest.net/ ,可以使用urlparse 模块从查询字符串中其解析出来。

    该查询字符串解析方法可以用于抽取所有链接。  

    成功了!从Google搜索中得到的链接已经被成功抓取出来了。该示例的完整源码可以从https:// bitbucket.org/wswp/code/src/tip/chapter09/google.py获取。  
    抓取 Google 搜索结果时会碰到的一个难点是,如果你的IP出现可疑行为,比如下载速度过快, 则会出现验证码图像如下图所示

    我们可以使用第7章中介绍的技术来解决验证码图像这一 问题,不过更好的方法是降低下载速度,或者在必须高速下载时使用代理,以避免被Google怀疑。

9.2 Facebook

    目前,从月活用户数维度来看,Facebook 是世界上最大的社交网络之一 ,因此其用户数据非常有价值。

9.2.1 网 站

    下图所示为 Packt 出版社的 Facebook 页面,其网址为https://www. facebook.com/PacktPub。
    当你查看该页的源代码时,可以找到最开始的几篇日志,但是后面的日志只有在浏览器滚动时才会通过 AJAX 加载。另外, Facebook 还提供 了 一个移 动端界面, 正如第 l 章所述, 这种形式的界面通常更容易抓取。该页面在移 动端的网址为https://m.facebook.com/PacktPub,如下图所示。

    当我们与移动端网站进行交互,并使用 Firebug 查看时,会发现该界面使用了和之前相似的结构用于处理 AJAX 事件,因此该方法实际上无法简化抓取。虽然这些 AJAX 事件可以被逆向工程,但是不同类型的 Facebook 页面使用了不同的 AJAX 调用,而且依据我的过往经验,Facebook 经常会变更这些调用的结构,所以抓取这些页面需要持续维护。因此,如第5章所述,除非性能十分重要,否则最好使用浏览器渲染引擎执行JavaScript事件,然后访问生成的 HTML 页面。
    下面的代码片段使用 Selenium 自动化登录 Facebook,并跳转到给定页面的 URL。

    然后,可以调用该函数加载你感兴趣的 Facebook 页面,并抓取生成的HTML页面。

 9.2.2 API

    如第1章所述,抓取网站是在其数据没有给出结构化格式时的最末之选。而 Facebook 提供了 一些数据的API,因此我们需要在抓取之前首先检查一下 Facebook 提供的这些访问是否己经满足需求。下面是使用 Facebook 的 图形 API从Packt 出版社页面中抽取 数据的代码示例。

    该 API 调用以 JSON 格式返回数据,我们可以使用 json 模块将其解析为 Python 的 diet 类型。 然后 ,我们可以从中抽取一些有用的特征,比如公司名、详细信息以及网站等。
    图形 API 还提供了很多访问用户数据的其他调用,其文档可以从Facebook 的开发者页面中获取 网址为 https://developers.facebook.com/docs/graph-api。不过,这些 API 调用多数是设计给与己授 权的 Facebook 用户交互的 Facebook 应用的,因此在抽取他人数据时没有太大用途。要想得 到更加详细的信息,比如用户日志,仍然需要爬虫。

9.3 Gap

    Gap 拥有一个结构化良好的网站,通过 Sitemap 可以帮助网络爬虫定位其最新的内容。如果我们使用第 1 章中学到的技术调研该网站,则会发现在 http://www.gap.com/robots.txt这一网址下的 robots.txt文件中包含了网站地图的链接。

     下面是链接的 Sitemap 文件中的内容。

    如 上 所 示 , Sitemap 链 接 中 的 内 容仅仅是索 引 , 其中又包 含 了 其他 Sitemap 文件的 链接 。 其他的 这些 S i temap 文件中 则包含 了 数千种产 品类目 的链接, 比如 http : / /www . gap.com/products /blue-long- s leeve ­ shirts- for -me n .jsp ,如下图所示
    这里有大量要爬取的内容因此我们将使用第 4 章 中开发的多线程爬虫。 你可能还记得该爬虫支持一个可选的回调参数,用于定义如何解析下载到的网页。下面是爬取 Gap 网站中Sitemap 链接 的回调函数。

 

        该回调函数首先检查下载到的URL的扩展名。如果扩展名为.xml,则认为下载到的URL是 Sitemap 文件,然后使用 lxml 的 etree 模块解析B任文件并从中抽取链接。否则,认为这是一个类 目 URL,不过本例中还没有实现抓取类目的功能。现在,我们可以在多线程爬虫中使用该回调函数来爬取 gap.com 了。

 

 

    和预期一样,首先下载的是Sitemap文件,然后是服装类目。 

9.4 宝马

    宝马官方网站中有一个查询本地经销商的搜索工具,其网址为https://www.bmw.de/de/home. html?entryType=dlo,界面如下图所示

    该工具将地理位置作为输入参数,然后在地图上显示附近的经销商地点比如在下图中以Berlin作 为搜索参数

     使用Firebug,我们会发现搜索触发了如下AJAX请求。

    这里, maxResults 参数被设为 99。不过,我们可以使用第1章中介绍的技术增大该参数的值, 以便在一次请求中下载所有经销商的地点。下面是将 maxResults 的值增加到 1000 时 的输出结果 

 

    AJAX请求提供了JSONP格式的数据其中JSONP是指填充模式的JSON (JSON withpadding)。 这里的填充通常是指要调用的函数,而函数的参数则为纯JSON数据,在本例中调用的是callback 函数。要想使用 Python 的json模块解析该数据,首先需要将填充部分截取掉。

    现在,我们已经将德国所有的宝马经销商加载到 JSON 对象中,可以看出目前总共有731个经销 商。下面是第一个经销商的数据。

 

    现在可以保存我们感兴趣的数据了。下面的代码片段将经销商的名称和经纬度写入一个电子表格 当中。
运行该示例后 , 得到的bmw.csv表格中的内容类似如下所示。

   从宝马官网抓 数据的完整源代码可以从 https:/ /b i t b uc ket . org/wswp/code/src/tip/chapter09/bmw.py获取。

9.5 本章小结

    本章分析了几个著名网站,并演示了如何在其中应用本书中介绍过的技术。我们在抓取 Google 结果页时使用了css 选择器,在抓取Facebook页面时测试了浏览器渲染引擎和 API,在爬取Gap时使用了Sitemap,在从地图中抓取所有宝马经销商时利用了 AJAX 调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/34087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

azure databricks因为notebook 日志打多或者打印图片太多,往下拉卡死怎么处理

1、同事碰到个问题,databricks 页面卡死不动了 2、我。。。。。。。。测试了下搞不定,找azure的工程师,特此笔记如下图 !](https://img-blog.csdnimg.cn/5db9756d0e224d15a9a607561b47591f.png)

2014年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 💕兴趣爱好:b站天天刷&…

QT ObjectThread moveToThread多线程操作

QT多线程专栏共有15篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池、ObjectThread多线程操作、 moveToThread等线程操…

LeetCode 打卡day46-- 单词拆分和多重背包问题

一个人的朝圣 — LeetCode打卡第46天 知识总结 Leetcode 139. 单词拆分题目说明代码说明 知识总结 今天写了一道题目, 但是还挺难的, 而且是面试高频题目 还过了一遍多重背包问题. 多重背包与01背包的区别在于多重背包限制了物品的个数, 某些物品的个数可能不为1, 可以使用两…

c++day3

#include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;cout << "无参构造函数" <<endl;}//有参构造Person(int age,int num){this->age age;this->pnew int…

【Docker】Docker中 AUFS、BTRFS、ZFS、存储池概念的详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

基于SpringCloud微服务毕业论文管理系统设计与实现

一、概述 1.1 课题背景及意义 随着学校不断扩大和学生人数的猛增,关于各类教学信息也越来越多。毕业论文的管理也成为了不可避免的一道关卡,学生需要及时获取论文相关进度,学校的管理者要求能方便对论文进行处理。基于这些需求,开发一个实用的微服务管理系统,以满足双方…

GELU激活函数

GELU是一种常见的激活函数&#xff0c;全称为“Gaussian Error Linear Unit”&#xff0c;其图像与ReLU、ELU对比如下&#xff1a; 文章链接&#xff1a;https://arxiv.org/pdf/1606.08415.pdf https://pytorch.org/docs/master/generated/torch.nn.GELU.html 公式为&#xff1…

Spring Cloud - HTTP 客户端 Feign 、自定义配置、优化、最佳实践

目录 一、Feign 是什么&#xff0c;有什么用呢&#xff1f; 二、Feign 客户端的使用 2.1、远程调用 1.引入依赖 2.在order-service&#xff08;发起远程调用的微服务&#xff09;的启动类添加注解开启Feign的功能 3.编写 Feign 客户端 4.通过 Feign 客户端发起远程调用 …

flutter 简介 flutter 能为我们做什么

flutter 简介 flutter 能为我们做什么 前言一、什么是Flutter&#xff1f;二、Flutter的特点和优势三、Flutter与其他跨平台框架的比较总结 前言 陆陆续续已经写了60多篇的flutter 的文章了&#xff0c;本篇文章就来说说我对flutter 的简单看法 一、什么是Flutter&#xff1f…

excel相关操作

文章目录 1、数据分列与绘图1.1、杂乱的数据拷贝到excel1.2、 智能分列1.2 或者手动设置分列1.3、杂论的符号替换掉1.4、对时间再次只能分裂1.5、绘图 1、数据分列与绘图 1.1、杂乱的数据拷贝到excel 1.2、 智能分列 选择数据&#xff0c;数据–>分列–> 智能分列 结…

速成!|量子粒子群优化算法及其实现(Matlab)

作者在前面的两篇文章中介绍了标准粒子群及其变体&#xff0c;**由于PSO算法需要设定的参数(惯性因子w&#xff0c;学习因子 c1&#xff0c;c2)太多&#xff0c;不利于找到待优化模型的最优参数&#xff0c;而且粒子位置变化缺少随机性&#xff0c;容易陷入局部最优。**针对这些…

UNet Pytorch实现

用于图像分割的不同种类的Unet模型的实现 UNet - U-Net&#xff1a; 用于生物医学图像分割的卷积网络 https://arxiv.org/abs/1505.04597RCNN-UNet - 基于U-Net的递归残差卷积神经网络&#xff08;R2U-Net&#xff09;用于医学图像分割 https://arxiv.org/abs/1802.06955Atten…

第八十五天学习记录:C++核心:内存分区模型

内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理 2、全局区&#xff1a;存放全局变量和静态变量以及常量 3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数…

5.8.2 TCP报文段首部格式

5.8.2 TCP报文段首部格式 TCP报文段首部格式在很大程度上体现了TCP协议的功能 一、数据封装过程 如图 应用层报文传送到传输层之后&#xff0c;加上TCP报文段的首部构成了TCP数据传送单位&#xff0c;我们称之为TCP报文段。在发送时TCP报文段是作为IP数据报的数据部分&#…

阿里巴巴开源Chat2DB v1.0.11 初体验

阿里巴巴开源Chat2DB v1.0.11 初体验 前言什么是Chat2DB下载安装安装配置Chat2DB初体验配置数据源准备测试数据认识几个功能菜单开始测试自然语言转SQLSQL解释SQL优化 使用总结后续功能结语 前言 作为一名阿里巴巴开源项目的拥护者&#xff0c;从Chat2DB开源至今都有关注这个开…

大型汽车制造业S4/HANA升级选择性数据迁移案例实践

自2015年正式发布以来&#xff0c;SAP S/4HANA已经成为全球数万家客户的共同选择。作为目前最主流的SAP ERP管理解决方案&#xff0c;支持企业革新业务流程&#xff0c;推动数字化转型进程。 S/4HANA升级技术路径如何选择&#xff1f; 全新实施or全量数据转换or选择性数据迁移…

【爬虫】对某某贴吧主页的爬虫分析+源码

1. 网站分析 想要的内容有标题、时间和帖子跳转链接 查看网站源代码&#xff0c;发现想要的内容就在里面&#xff0c;那就好办了&#xff0c;直接上正则&#xff0c;当然beautifulsoup也不是不可以 2. Python源码 import requests import re from prettytable import PrettyTa…

【Servlet学习三】实现一个内存版本的简易计算器~

目录 一、方式1&#xff1a;使用form表单的形式&#xff08;不推荐&#xff09; &#x1f308;1、前端代码&#xff1a;HTML文件 &#x1f308;2、后端代码&#xff1a;Calculator_form.java文件 &#x1f308;3、最终效果 二、方式2&#xff1a;使用ajax形式&#xff08;…

如何确保大模型追求“正确”的目标?丨AI安全与对齐圆桌回顾

导读 在智源大会「AI 安全与对齐」论坛上&#xff0c;与会嘉宾针对目前人们关心的 AI 安全控制标准、多智能体强化学习环境下的安全、开源对 AI 安全的影响、对智能涌现安全的思考等问题展开了讨论。 能力越大&#xff0c;责任越大。 嘉宾名单 谢旻希丨主持人&#xff0c;安远A…
最新文章