python网页数据抓取( Web抓取的探险之前,如何得到那些重要数据呢?)

优采云 发布时间: 2021-10-16 10:03

  python网页数据抓取(

Web抓取的探险之前,如何得到那些重要数据呢?)

  

  随着电子商务的蓬勃发展,作者近年来对比价应用越来越着迷。每次线上(甚至线下)购买,都是对各大电商深度研究的结果网站。

  作者常用的比价应用包括:RedLaser、ShopSavvy 和 BuyHatke。这些应用程序有效地提高了价格透明度,从而为消费者节省了大量时间。

  但是,您有没有想过这些应用程序是如何获取这些重要数据的?通常,他们使用 Web 抓取技术来完成此任务。

  网页抓取的定义

  网络抓取是提取网络数据的过程。借助合适的工具,您可以提取任何您能看到的数据。在本文中,我们将重点介绍自动提取过程的过程,以帮助您在短时间内采集大量数据。除了我上面提到的用例,抓取技术的用途还包括:SEO跟踪、工作跟踪、新闻分析,以及我最喜欢的社交媒体情绪分析!

  提醒

  在开始网络抓取冒险之前,请确保您了解相关的法律问题。许多 网站 在其服务条款中明确禁止抓取其内容。例如,Medium 网站 写道:“按照网站 robots.txt 文件中的规定抓取是可以接受的,但我们禁止抓取。” 爬不准爬的网站可能会把你拉上他们的黑名单!与任何工具一样,网页抓取也可能用于不受​​欢迎的目的,例如复制 网站 内容。此外,网络爬虫引发的法律诉讼也不少。

  设置代码

  在完全理解需要谨慎处理之后,让我们开始学习网络抓取。事实上,网页抓取可以用任何编程语言实现。前不久,我们用Node来实现。在本文中,考虑到它的简单性和丰富的包支持,我们将使用 Python 来实现爬虫程序。

  网页抓取的基本过程

  当您在网络上打开一个站点时,它的 HTML 代码将被下载,您的 Web 浏览器将对其进行分析和显示。HTML 代码收录您看到的所有信息。因此,可以通过分析 HTML 代码获得所需的信息(如价格)。您可以使用正则表达式在数据海洋中搜索您需要的信息,也可以使用函数库来解释HTML,也可以获取您需要的数据。

  在 Python 中,我们将使用一个名为 Beautiful Soup 的模块来分析 HTML 数据。您可以借助安装程序(例如 pip)进行安装,只需运行以下代码:

  pip install beautifulsoup4

  或者,您可以从源代码构建。在本模块中,您可以看到详细的安装步骤。

  安装完成后,我们一般会按照以下步骤来实现网页抓取:

  作为演示,我们将使用作者的博客作为目标 URL。

  前两步比较简单,可以这样完成:

  from urllib import urlopen#Sending the http requestwebpage = urlopen('http://my_website.com/').read()

  接下来,将响应传递给之前安装的模块:

  from bs4 import BeautifulSoup#making the soup! yummy ;)soup = BeautifulSoup(webpage, "html5lib")

  请注意,这里我们选择了 html5lib 作为解析器。根据它,您还可以为其选择不同的解析器。

  解析 HTML

  将 HTML 传递给 BeautifulSoup 后,我们可以尝试一些命令。例如,要检查 HTML 标记代码是否正确,您可以验证页面的标题(在 Python 解释器中):

  >>> soup.titleTranscendental  Tech Talk>>> soup.title.text

u'Transcendental  Tech Talk'

>>>

  接下来,开始提取页面中的特定元素。例如,我想提取博客中的 文章 标题列表。为此,我需要分析 HTML 的结构,这可以在 Chrome 检查器的帮助下完成。其他浏览器也提供了类似的工具。

  

  使用 Chrome 检查器检查页面的 HTML 结构

  如您所见,所有 文章 标题都有 h3 标签和两个类属性:post-title 和 entry-title 类。因此,搜索所有带有 post-title 类的 h3 元素,以获取页面的 文章 标题列表。在这个例子中,我们使用了 BeautifulSoup 提供的 find_all 函数,并使用 class_ 参数来确定所需的类:

  >>> titles = soup.find_all('h3', class_ = 'post-title') #Getting all titles>>> titles[0].textu'\nKolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips\n'>>>

  您应该通过仅通过 post-title 类搜索项目来获得相同的结果:

  >>> titles = soup.find_all(class_ = 'post-title') #Getting all items with class post-title>>> titles[0].textu'\nKolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips\n'>>>

  如果您想了解有关条目引用的链接的更多信息,可以运行以下代码:

  >>> for title in titles:...     # Each title is in the form of Post Title<a/>...     print title.find("a").get("href")...http://dada.theblogbowl.in/2015/09/kolkata-bergerxp-indiblogger-meet.html

http://dada.theblogbowl.in/2015/09/i-got-published.html

http://dada.theblogbowl.in/2014/12/how-to-use-requestput-or-requestdelete.html

http://dada.theblogbowl.in/2014/12/zico-isl-and-atk.html...>>>

  BeautifulSoup 有许多内置方法可以帮助您玩转 HTML。下面列出了其中一些方法:

  >>> titles[0].contents

[u&#39;\n&#39;, Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips</a>, u&#39;\n&#39;]>>>

  请注意,您也可以使用 children 属性,但它有点像*敏*感*词*:

  >>> titles[0].parent\n</a>\n\nKolkata #BergerXP IndiBlogger ...

>>>

  为此,您还可以使用正则表达式来搜索 CSS 类。

  使用 Mechanize 模拟登录

  到目前为止,我们所做的只是下载页面并分析其内容。但是,Web 开发者可能会阻塞非浏览器请求,或者某些网站 内容只有登录后才能读取。那么,我们如何处理这些情况呢?

  对于第一种情况,我们需要在向页面发送请求时模拟浏览器。每个 HTTP 请求都收录一些相关的数据头,其中收录访问者的浏览器、操作系统和屏幕大小等信息。我们可以改变这些数据头,冒充浏览器发送请求。

  对于第二种情况,为了访问有访问者限制的内容,我们需要登录网站并使用cookies来维护会话。接下来,让我们看看如何在冒充浏览器的情况下完成此操作。

  我们将使用 cookielib 模块来管理使用 cookie 的会话。此外,我们还将使用 mechanize,它可以使用 pip 等安装程序进行安装。

  我们将通过博客碗页面登录并访问通知页面。以下代码由内联注释解释:

  import mechanize

import cookielib

from urllib import urlopen

from bs4 import BeautifulSoup# Cookie Jarcj = cookielib.LWPCookieJar()

browser = mechanize.Browser()

browser.set_cookiejar(cj)

browser.set_handle_robots(False)

browser.set_handle_redirect(True)# Solving issue #1 by emulating a browser by adding HTTP headersbrowser.addheaders = [(&#39;User-agent&#39;, &#39;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1&#39;)]# Open Login Pagebrowser.open("http://theblogbowl.in/login/")# Select Login form (1st form of the page)browser.select_form(nr = 0)# Alternate syntax - browser.select_form(name = "form_name")# The first  tag of the form is a CSRF token# Setting the 2nd and 3rd tags to email and passwordbrowser.form.set_value("email@example.com", nr=1)

browser.form.set_value("password", nr=2)# Logging inresponse = browser.submit()# Opening new page after loginsoup = BeautifulSoup(browser.open(&#39;http://theblogbowl.in/notifications/&#39;).read(), "html5lib")

  

  通知页面的结构

  # Print notificationsprint soup.find(class_ = "search_results").text

  

  登录通知页面后的结果

  结束语

  很多开发者会告诉你:你在网上看到的任何信息都可以被抓取。通过这个文章,你学会了如何轻松提取登录后才能看到的内容。另外,如果你的IP被屏蔽了,你可以屏蔽你的IP地址(或选择其他地址)。同时,为了看起来像一个人在访问,你应该在请求之间保持一定的时间间隔。

  随着人们对数据的需求不断增长,网络抓取(无论出于好坏的原因)只会在未来得到更广泛的应用。因此,了解其原理非常重要,无论您是要有效地使用该技术还是避免其陷入困境。

  OneAPM 可以帮助您查看 Python 应用程序的各个方面。它不仅可以监控终端的用户体验,还可以监控服务器的性能。它还支持跟踪数据库、第三方 API 和 Web 服务器问题。阅读更多技术文章,请访问OneAPM官方技术博客。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线