Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

使用基本的Python工具获得一些实践经验,以获取完整的HTML站点。

图片来源 : Jason Baker for Opensource.com.

有很多很棒的书可以帮助您学习Python,但是谁真正读了这些书呢?(提示:不是我)。

很多人觉得参考书很有用,但我通常不会从头到尾阅读全书来学习。我是通过做项目,努力搞清楚一些事情,然后读另一本书来学习。所以,暂时丢掉书,让我们学习一些Python。

下面是我用Python编写的第一个抓取项目的指南。它对Python和HTML的假定知识非常少。本文旨在说明如何使用Python库请求访问网页内容,并使用BeatifulSoup4以及JSON和pandas解析内容。我将简要介绍Selenium,但不会深入研究如何使用该库(该主题有自己的教程)。最后,我希望向您展示一些技巧和窍门,以减少网络抓取的麻烦。

安装依赖

本指南中的所有资源都可以在我的GitHub回购中找到。如果您需要安装Python 3的帮助,请查看Linux,Windows和Mac的教程。

如果你喜欢使用JupyterLab,可以使用此笔记本运行所有代码。有很多方法可以安装JupyterLab,这是其中一种:

为我们的网页抓取项目设定目标现在我们已经安装了依赖项,但是抓取网页需要什么呢?

让我们退后一步,并确保阐明我们的目标。这是我成功完成Web抓取项目的要求列表 :

收集值得构建有效的网络刮板的信息

下载可以通过网络抓取工具合法地和道德地收集的信息

了解如何在HTML代码中找到目标信息

拥有正确的工具:在这种情况下,它是库BeautifulSoup和request

如何解析JSON对象

有足够的数据技能可以使用pandas

关于HTML的评论:尽管HTML是运行Internet的野兽,但我们最需要了解的是标签的工作方式。标签是夹在尖括号括起来的标签之间的信息的集合。例如,这是一个假标签,称为“ pro-tip”:

我们可以通过调用其标签“ pro-tip”来访问其中的信息(“您需要知道的所有...”)。本教程将进一步介绍如何查找和访问标签。要进一步了解HTML基础知识,请查看本文。

在网络抓取项目中寻找什么

一些收集数据的目标比其他目标更适合于网络抓取。我的合格项目指导方针如下 :

没有可用于数据的公共API。通过API捕获结构化数据会容易得多,这将有助于阐明收集数据的合法性和道德性。需要大量的结构化数据,采用规则的,可重复的格式来证明这一点。刮网可能会很痛苦。BeautifulSoup(bs4)使此操作变得更容易,但不可避免的是需要定制的网站的个性。不需要相同的数据格式,但这确实使事情变得容易。当前存在的“边际案例”(偏离规范)越多,刮取将越复杂。

免责声明:我的法律培训为零;以下内容并非旨在作为正式的法律建议。

关于合法性,访问大量信息可能会令人陶醉,但是仅仅因为有可能并不意味着就应该这样做。

值得庆幸的是,有一些公共信息可以指导我们的道德和网络爬虫。大多数网站都有与该网站相关联的robots.txt文件,指示允许哪些刮取活动,哪些不允许。它主要是用于与搜索引擎(最终的网络抓取工具)进行交互。但是,网站上的许多信息都被视为公共信息。因此,有些人将robots.txt文件视为一组建议,而不是具有法律约束力的文档。robots.txt文件未涉及诸如道德收集和数据使用之类的主题。

在开始抓取项目之前,我问自己以下问题我要刮取受版权保护的材料吗?

我的抓取活动会损害个人隐私吗?

我是否发出大量可能会使服务器超载或损坏的请求?

报废是否有可能暴露我不拥有的知识产权?

是否有管理网站使用的服务条款,我是否遵循这些条款?

我的抓取活动会减少原始数据的价值吗?(例如,我是否打算按原样重新打包数据,或者可能从原始来源中窃取网站流量)?

当我抓取网站时,请确保对所有这些问题回答“否”

要想更深入地了解这些法律问题,请参阅Krotov和Silva出版的2018年出版的出版物《网络抓取的合法性和伦理》,以及塞拉斯出版的《20年的网络抓取》和《计算机欺诈和滥用法案》。

现在是时候抓取了

经过上述评估,我想到了一个项目。我的目标是提取爱达荷州所有Family Dollar商店的地址。这些商店在农村地区规模很大,因此我想了解在一个相当乡村的状态下有多少家商店。

起点是Family Dollar的位置页面。

首先,在Python虚拟环境中加载先决条件。从这里的代码是指被添加到一个Python文件(scraper.py如果你正在寻找一个名称),或在JupyterLab电池运行。

接下来,从目标URL请求数据。

BeautifulSoup将采用HTML或XML内容并将其转换为复杂的对象树。这是我们将使用的几种常见对象类型:

BeautifulSoup —— 解析的内容

标签 —— 一个标准的HTML标签,您将遇到的bs4元素的主要类型

NavigableString —— 标签内的文本字符串

注释 —— NavigableString的一种特殊类型

当我们查看request.get()输出时,还有更多要考虑的问题。我只使用page.text()将请求的页面转换为可读的内容,但是还有其他输出类型:

page.text()用于文本(最常见)

page.content()用于逐字节输出

JSON对象的page.json()

page.raw()用于原始套接字响应

我只在使用拉丁字母的纯英语网站上工作。为此,请求中的默认编码设置可以正常工作。但是,除了纯英语网站之外,还有一个丰富的互联网世界。为了确保请求正确解析内容,可以设置文本的编码:

仔细研究BeautifulSoup标签,我们看到:

bs4元素标签正在捕获HTML标签

它具有名称和属性,可以像字典一样访问:tag ['someAttribute']

如果标签具有多个具有相同名称的属性,则仅访问第一个实例

可以通过tag.contents访问标签的子级

可以使用tag.contents访问所有标记后代

你始终可以使用re.compile(“ your_string”)作为字符串访问全部内容,而不用浏览HTML树

确定如何提取相关内容

警告:此过程可能令人沮丧。

web抓取期间的提取可能是一个令人畏惧的过程,其中充满了错误。我认为解决此问题的最佳方法是从一个有代表性的示例开始,然后进行扩展(此原则适用于任何编程任务)。查看页面的HTML源代码至关重要。有很多方法可以做到这一点。

您可以在终端中使用Python查看页面的整个源代码(不建议使用)。运行此代码需要您自担风险:

虽然打印出页面的整个源代码可能适用于某些教程中显示的玩具示例,但大多数现代网站的任何页面上都有大量内容。甚至404页面也可能充满了页眉,页脚等代码。

通常最简单的方法是在您喜欢的浏览器中通过“ 查看页面源代码”浏览源代码(单击鼠标右键,然后选择“查看页面源代码”)。这是找到目标内容的最可靠方法(稍后我将解释原因)。

在这种情况下,我需要在广阔的HTML海洋中找到我的目标内容-地址,城市,州和邮政编码。通常,对页面源(ctrl + F)的简单搜索将产生目标位置所在的部分。一旦我可以实际看到目标内容的示例(至少一个商店的地址),便会寻找将该内容与其他内容区分开的属性或标签。

看来,首先,我需要通过Family Dollar商店收集爱达荷州不同城市的网址,并访问这些网站以获取地址信息。这些网址似乎都包含在href标签中。大!我将尝试使用find_all命令进行搜索:

该死的,搜索href没有产生任何结果。这可能已失败,因为href嵌套在类itemlist中。对于下一次尝试,请搜索item_list。因为“ class”是Python中的保留字,所以使用class_代替。bs4函数soup.find_all()原来是bs4函数的瑞士军刀。

有趣的是,我发现搜索特定的课程通常是一种成功的方法。我们可以通过找到对象的类型和长度来了解更多有关该对象的信息。

可以使用.contents提取此BeautifulSoup“ ResultSet”中的内容。这也是创建单个代表性示例的好时机。

使用.attr查找该对象的内容中存在哪些属性。注意:.contents通常返回正好一个项目的列表,因此第一步是使用方括号符号为该项目建立索引。

现在,我看到href是一个属性,可以像字典项一样提取它:

所有的探索为我们提供了前进的道路。这是上面我们弄清楚的逻辑的清理版本。

输出在爱达荷州要抓取的Family Dollar商店的URL的列表。

也就是说,我仍然没有地址信息!现在,需要抓取每个城市的URL以获得此信息。因此,我们使用一个具有代表性的示例重新开始该过程。

地址信息嵌套在type =“ application / ld + json”中。经过大量的地理位置抓取之后,我开始认识到这是用于存储地址信息的通用结构。幸运的是,soup.find_all()还可启用对type的搜索。

地址信息在第二个列表成员中.最后!

我使用.contents(从第二个列表项中)提取了内容(这是过滤后的一个很好的默认操作)。由于内容的输出是一个列表,因此我索引了该列表项:

看起来不错。此处显示的格式与JSON格式一致(而且,该类型的名称中确实包含“ json ”)。JSON对象的作用类似于内置嵌套字典的字典。一旦熟悉它,它实际上就是一种不错的格式(当然,它比一长串RegEx命令更容易编程)。尽管从结构上看这看起来像一个JSON对象,但它仍然是bs4对象,需要通过正式的编程转换为JSON才能作为JSON对象进行访问:

在该内容中,有一个称为地址的关键字,该关键字在较小的嵌套字典中具有所需的地址信息。可以这样检索:

现在,可以遍历爱达荷州的列表存储URL:

使用pandas清除我们的网页抓取结果

我们在词典中有大量数据,但是我们还有一些额外的缺点,这将使重用我们的数据比实际需要的更为复杂。为了完成一些最终的数据组织步骤,我们将转换为pandas数据框,删除不需要的列“ @type ”和“ country ”),并检查前五行以确保一切正常。

确保保存结果!!

我们做到了!所有爱达荷州Family Dollar商店都有一个逗号分隔的列表。

简单介绍一下Selenium和数据抓取

Selenium是用于与网页自动交互的常用实用程序。为了解释为什么有时必须使用它,让我们来看一个使用Walgreens网站的示例。Inspect Element提供了浏览器中显示的代码:

而视图页源提供了什么请求将获得的代码:

如果这两个不同意,则有一些插件可以修改源代码,因此,应在将页面加载到浏览器中之后对其进行访问。请求不能做到这一点,但是Selenium可以做到。

Selenium需要Web驱动程序来检索内容。实际上,它会打开Web浏览器,并收集此页面的内容。Selenium功能强大-它可以通过多种方式与加载的内容进行交互(请阅读文档)。使用Selenium获取数据后,继续像以前一样使用BeautifulSoup:

对于Family Dollar,我不需要Selenium,但是当呈现的内容与源代码不同时,我确实会保留Selenium。

最后

总之,使用网络抓取来完成有意义的任务时:

耐心一点、查阅手册(这些非常有用)

如果您对答案感到好奇,美国有很多Family Dollar商店

完整的源代码是:

英文原文:https://opensource.com/article/20/5/web-scraping-python

译者: Yang

python的web抓取_使用Python进行web抓取的新手指南相关推荐

  1. python爬虫实时更新数据_爬虫的增量式抓取和数据更新

    一些想法 页面爬的多了,量上去了之后,就会遇到其他的问题,其实不管做什么技术量大了都会有问题.一般情况下,我认为解决"大量"问题的思路有两个:一种是着力于优化系统的能力,让原本只能 ...

  2. 京东app优惠券python抓取_京东app商品信息爬取

    抓取目标: 我们的抓取目标是京东商城的App电子商品信息,并将信息保存到MongoDB数据库中. 抓取商品信息的id号.标题.单价.评价条数等信息 准备工作和抓取分析 准备工作: 安装app抓包工具C ...

  3. webscraper多页爬取_数据收集:web scraper 多页(无规律url)抓取

    前言 web scraper是一个很好用的Chrome爬虫插件,它易学易用,能够满足大部分需求,而且因为是基于浏览器渲染的,所以能回避很多反爬虫问题.另外,web scraper可以多开进程,对于一些 ...

  4. python websocket库有什么_常用Python爬虫与Web开发库有哪些?

    Python爬虫和Web开发均是与网页相关的知识技能,无论是自己搭建的网站还是爬虫爬去别人的网站,都离不开相应的Python库,以下是常用的Python爬虫与Web开发库. **1.爬虫库** bea ...

  5. python 开发安卓应用商店_用Python爬取各Android市场应用下载量(3分钟学会)

    就是这么简单! 文章目录 前言 设计一个函数 构造要爬取的网址 确定要爬取的内容的位置 构建输入和调用部分 程序完整代码 0 前言 有时候,总有一些重复又琐碎的工作,却不得不做-- 一个个统计,也不是 ...

  6. python输入数据爬取_利用 Python 爬取高德地图数据

    准备1.高德开放平台注册账户 https://lbs.amap.com/dev/index 验证手机号码.邮箱后进入开发者后台创建一个应用: 并为该应用添加 Key,服务平台选择 web 服务 申请完 ...

  7. python爬贴吧回复_通过python爬取贴吧数据并保存为word

    前言 Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发 ...

  8. python爬虫爬当当网_爬虫实战一:爬取当当网所有 Python 书籍

    本文转载自微信公众号[ 极客猴 ],作者知乎主页 此前错误标注来源导致侵权,在此表示歉意. 我们已经学习 urllib.re.BeautifulSoup 这三个库的用法.但只是停留在理论层面上,还需实 ...

  9. python爬淘宝店铺_【Python爬虫案例学习】Python爬取淘宝店铺和评论

    安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动sel ...

  10. python使用函数的目的_在Python 3.x中经常看到定义函数有一个单独的 * 参数?定义这样参数的目的是?怎样对其取值呢?...

    参数在python中总是通过赋值进行传递的.在默认情况下,参数是通过其位置进行匹配的,从左到右,而且必须精确的传递和函数头部参数名一样多的参数. 这种默认的传递方式很简单 def f(a,b,c): ...

最新文章

  1. oracle mod结果不正确,日常问题解决记录三:记一次Win10安装Oracle11g后遇到的问题...
  2. 谷歌浏览器输入框背景颜色变黄的解决方案
  3. 2018谷歌学术指数发布——看看综合、生物、生信、微生物领域高引文章和杂志
  4. 运维企业专题(3)LB负载均衡介绍
  5. 转:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  6. SSAS的MDX中的计算成员和命名集
  7. Mysql 忘记密码怎么办(win10)
  8. [转]Windows 下 Apache Virtual hosts 简单配置
  9. 上海市第三届上海市青少年算法竞赛(小学组)线上同步赛 数洞洞
  10. 图片去水印的原理_图片去水印方法 图片如何去掉水印
  11. OpenWrt开发必备软件模块——进程管理服务procd
  12. 【ME909】华为ME909 4G LTE模块在树莓派下通过minicom进行发送短信演示
  13. React Native + react-native-camera 实现扫描二维码「安卓」
  14. Sorry, The number you dialed is power off.
  15. 转 Python爬虫实战一之爬取糗事百科段子
  16. 汇编中的test和cmp指令[Z]
  17. 史上最全的CTF保姆教程 从入门到入狱【带工具】
  18. mysql查询数据的总记录数
  19. HTTP请求OPTION
  20. 世界上没有哪一份工作是不受气的

热门文章

  1. React:关于react的一些问题
  2. 吉首大学计算机科学与技术怎么样,吉首大学是几本 学生评价怎么样好不好(10条)...
  3. 使用VLC开源库开发播放器
  4. html a 标签颜色设置颜色设置,font标签
  5. Map集合的遍历(方式2)
  6. d你好Arduino
  7. 【Android FFMPEG 开发】Android 中使用 FFMPEG 将 PCM 音频采样转为 MP3 格式
  8. 使用CRT作为sock5代理,本地浏览器直接访问堡垒机
  9. JavaWeb项目_仿小米商场
  10. mysql workbench 行高_CSS行高——line-height