网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
对网页结构和 HTML 有了一些基本认识之后, 咱们就能用 Python 来爬取这个网页的一些基本信息. 首先要作的, 是使用 Python 来登陆这个网页, 并打印出这个网页 HTML 的 source code. 注意, 由于网页中存在中文, 为了正常显示中文, read() 完之后, 咱们要对读出来的文字进行转换, decode() 成能够正常显示中文的形式.we
rom 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>
BeautifulSoup 解析网页: 基础
咱们了解了网页 (html) 的基本构架, 知道了爬网页就是在这个构架中找到须要的信息. 那么找到须要的信息时, BeautifulSoup 就是一个找信息好帮手. 它能帮你又快有准地找到信息. 大大简化了使用难度.
咱们总结一下爬网页的流程, 让你对 BeautifulSoup 有一个更好的定位.
- 选着要爬的网址 (url)
- 使用 python 登陆上这个网址 (urlopen等)
- 读取网页信息 (read() 出来)
- 将读取的信息放入 BeautifulSoup
- 使用 BeautifulSoup 选取 tag 信息等 (代替正则表达式)
初学的时候老是搞不懂这些包是干什么的, 如今你就能理解这个 BeautifulSoup 究竟是干什么的了.
安装
等什么, 知道 BeautifulSoup 这么方便, 咱们就赶忙装一个吧. 安装的步骤很简单, 用 pip 就能轻松安装.
# Python 2+
pip install beautifulsoup4
# Python 3+
pip3 install beautifulsoup4
注意在名字后面还有个 “4”, 多是表明第4版吧. 若是你在安装的时候遇到任何问题, 请参考他们官网上的解决方案.
简单实用方法
此次咱们仍是爬一爬上次爬的那个基本网页. BeautifulSoup 使用起来很是简单, 咱们先按常规读取网页.
from bs4 import BeautifulSoup
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)
回顾一下, 每张网页中, 都有两大块, 一个是 , 一个是 , 咱们等会用 BeautifulSoup 来找到 body 中的段落
和全部连接 .
<!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>
读取这个网页信息, 咱们将要加载进 BeautifulSoup, 以 lxml 的这种形式加载. 除了 lxml, 其实还有不少形式的解析器, 不过你们都推荐使用 lxml 的形式. 而后 soup 里面就有着这个 HTML 的全部信息. 若是你要输出
标题, 能够就直接 soup.h1.
soup = BeautifulSoup(html, features='lxml')
print(soup.h1)
"""
<h1>爬虫测试1</h1>
"""
print('\n', soup.p)
"""
<p>
这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
<a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a> 中的简单测试.
</p>
"""
若是网页中有过个一样的 tag, 好比连接 , 咱们可使用 find_all() 来找到全部的选项. 由于咱们真正的 link 不是在 中间 , 而是在 里面, 也能够看作是 的一个属性. 咱们能用像 Python 字典的形式, 用 key 来读取 l[“href”].
"""
<a href="https://morvanzhou.github.io/tutorials/scraping">爬虫教程</a>
"""
all_href = soup.find_all('a')
all_href = [l['href'] for l in all_href]
print('\n', all_href)
# ['https://morvanzhou.github.io/', 'https://morvanzhou.github.io/tutorials/scraping']
懂得这些仍是远远不够的, 真实状况每每比这些复杂. BeautifulSoup 还有不少其余的选择”加强器”. 下次, 咱们来了解一些 CSS 的概念, 用 BeautifulSoup 加上 CSS 来选择内容.
原文地址:
https://www.shangmayuan.com/a/e58a0438eb2648dca67c8820.html