python网页数据抓取( Web抓取的探险之前,如何得到那些重要数据呢?)
优采云 发布时间: 2021-10-16 10:03python网页数据抓取(
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'\n', Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips</a>, u'\n']>>>
请注意,您也可以使用 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 = [('User-agent', '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')]# 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('http://theblogbowl.in/notifications/').read(), "html5lib")
通知页面的结构
# Print notificationsprint soup.find(class_ = "search_results").text
登录通知页面后的结果
结束语
很多开发者会告诉你:你在网上看到的任何信息都可以被抓取。通过这个文章,你学会了如何轻松提取登录后才能看到的内容。另外,如果你的IP被屏蔽了,你可以屏蔽你的IP地址(或选择其他地址)。同时,为了看起来像一个人在访问,你应该在请求之间保持一定的时间间隔。
随着人们对数据的需求不断增长,网络抓取(无论出于好坏的原因)只会在未来得到更广泛的应用。因此,了解其原理非常重要,无论您是要有效地使用该技术还是避免其陷入困境。
OneAPM 可以帮助您查看 Python 应用程序的各个方面。它不仅可以监控终端的用户体验,还可以监控服务器的性能。它还支持跟踪数据库、第三方 API 和 Web 服务器问题。阅读更多技术文章,请访问OneAPM官方技术博客。