了解网页结构
优采云 发布时间: 2020-05-08 08:01学习资料:
学习爬虫, 首先要懂的是网页. 支撑起各类光鲜亮丽的网页的不是别的, 全都是一些代码.这种代码我们称之为 HTML,HTML 是一种浏览器(Chrome, Safari, IE, Firefox等)看得懂的语言, 浏览器能将这些语言转换成我们用肉眼见到的网页.所以 HTML 里面必将存在着好多规律, 我们的爬虫还能根据这样的规律来爬取你须要的信息.
其实不仅 HTML, 一同打造多彩/*敏*感*词*网页的组件还有 CSS 和. 但是这个简单的爬虫教程,大部分时间会将会使用 HTML.CSS 和 JavaScript 会在后期简单介绍一下. 因为爬网页的时侯多多少少还是要和 CSS JavaScript 打交道的.
虽然莫烦Python主打的是机器学习的教程. 但是这个爬虫教程适用于任何想学爬虫的朋友们.从机器学习的角度看爬虫结构, 机器学习中的大量数据, 也是可以从这种网页中来, 使用爬虫来爬取各类网页里面的信息, 然后再装入各类机器学习的方式,这样的应用途径正在越来越多被采用. 所以假如你的数据也是分散在各个网页中, 爬虫是你降低人力劳动的必修课.
网页基本组成部分
在真正步入爬虫之前, 我们先来做一下热身运动, 弄明白网页的基础, HTML 有什么组成部分,是怎么样运作的. 如果你早已十分熟悉网页的构造了, 欢迎直接跳过这一节, 进入下边的学习.
我制做了一个特别简易的网页, 给你们呈现以下最肉感的 HTML 结构.如果你点开它, 呈现在你眼前的, 就是下边这张图的上半部份. 而下半部份就是我们网页背后的 HTML code.
想问我是怎么见到 HTML 的 source code 的? 其实很简单, 在你的浏览器中 (我用的是 Google Chrome),显示网页的地方, 点击滑鼠右键,大多数浏览器就会有类似这样一个选项 “View Page Source”. 点击它能够看见页面的源码了.
在 HTML 中, 基本上所有的实体内容, 都会有个 tag 来框住它. 而这个被 tag 住的内容, 就可以被展示成不同的方式, 或有不同的功能.主体的 tag 分成两部份, header 和 body. 在 header 中, 存放这一些网页的网页的元信息, 比如说 title, 这些信息是不会被显示到你看见的网页中的.这些信息大多数时侯是给浏览器看, 或者是给搜索引擎的爬虫看.
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/static/img/description/tab_icon.png">
</head>
HTML 的第二大块是 body, 这个部份才是你看见的网页信息. 网页中的 heading, 视频, 图片和文字等都储存在这里.这里的 <h1></h1> tag 就是主标题, 我们看见呈现下来的疗效就是大一号的文字. <p></p> 里面的文字就是一个段落.<a></a>里面都是一些链接. 所以好多情况, 东西都是置于这种 tag 中的.
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试.
</p>
</body>
爬虫想要做的就是按照这种 tag 来找到合适的信息.
用 Python 登录网页
好了, 对网页结构和 HTML 有了一些基本认识之后, 我们能够用 Python 来爬取这个网页的一些基本信息.首先要做的, 是使用 Python 来登入这个网页, 并复印出这个网页 HTML 的 source code.注意, 因为网页中存在英文, 为了正常显示英文, read() 完之后, 我们要对读下来的文字进行转换, decode() 成可以正常显示英文的方式.
from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen(
"https://morvanzhou.github.io/static/scraping/basic-structure.html"
).read().decode('utf-8')
print(html)
print 出来就是下边这样啦. 这就证明了我们能否成功读取这个网页的所有信息了. 但我们还没有对网页的信息进行汇总和借助.我们发觉, 想要提取一些方式的信息, 合理的借助 tag 的名子非常重要.
<!DOCTYPE html>
<html lang="cn">
<head>
<meta charset="UTF-8">
<title>Scraping tutorial 1 | 莫烦Python</title>
<link rel="icon" href="https://morvanzhou.github.io/static/img/description/tab_icon.png">
</head>
<body>
<h1>爬虫测试1</h1>
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试.
</p>
</body>
</html>
匹配网页内容
所以这儿我们使用 Python 的正则表达式 RegEx 进行匹配文字, 筛选信息的工作. 我有一个很不错的正则表达式的教程,如果是中级的网页匹配, 我们使用正则完全就可以了, 高级一点或则比较冗长的匹配, 我还是推荐使用 BeautifulSoup.不急不急, 我知道你想偷懒, 我然后马上还会教 beautiful soup 了. 但是如今我们还是使用正则来做几个简单的事例, 让你熟悉一下套路.
如果我们想用代码找到这个网页的 title, 我们能够这样写. 选好要使用的 tag 名称 <title>. 使用正则匹配.
import re
res = re.findall(r"<title>(.+?)</title>", html)
print("\nPage title is: ", res[0])
# Page title is: Scraping tutorial 1 | 莫烦Python
如果想要找到中间的那种段落 <p>, 我们使用下边方式, 因为这个段落在 HTML 中还参杂着 tab, new line, 所以我们给一个flags=re.DOTALL 来对那些 tab, new line 不敏感.
res = re.findall(r"<p>(.*?)</p>", html, flags=re.DOTALL) # re.DOTALL if multi line
print("\nPage paragraph is: ", res[0])
# Page paragraph is:
# 这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
# <a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试.
最后一个练习是找一找所有的链接, 这个比较有用, 有时候你想找到网页里的链接, 然后下载一些内容到笔记本里,就靠这样的途径了.
res = re.findall(r'href="(.*?)"', html)
print("\nAll links: ", res)
# All links:
['https://morvanzhou.github.io/static/img/description/tab_icon.png',
'https://morvanzhou.github.io/',
'https://morvanzhou.github.io/tutorials/scraping']
下次我们就来瞧瞧为了图方面爬虫结构, 我们怎样使用 BeautifulSoup.
相关教程