笔者在大一时曾系统学习过python,但也只掌握了一些基础的语法知识,并没有真正的深入了解python。这次想尝试一下python中一个很重要的部分——爬虫。

测试库

先测试一下需要安装的库

1
2
3
4
5
import requests
from bs4 import BeautifulSoup
import selenium

print("ok")

得到ok说明库安装完成。

爬取自己博客


r.status_code 返回200,说明请求成功。
再尝试其他命令。

常用属性 说明
encoding 查看或者指定响应字符编码
status_code 返回HTTP响应码
url 查看请求的 url 地址
headers 查看请求头信息
cookies 查看cookies 信息
text 以字符串形式输出
content 以字节流形式输出,若要保存下载图片需使用该属性

爬取百度


爬取成功。
尝试r.headers,发现Content-Type没有带编码信息

默认为’ISO-8859-1’
r.text,存在大量乱码。
查看网页源代码或观察text发现网页编码设定为’utf-8’
设置后可以正常显示。

URL管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class UrlManager():
'''
Url管理器
'''
def __init__(self):
self.new_urls=set()
self.old_urls=set()

# 单个添加
def add_new_url(self,url):
if url is None or len(url)==0:
return
if url in self.new_urls or url in self.old_urls:
return
self.new_urls.add(url)

# 批量添加
def add_new_urls(self,urls):
if urls is None or len(urls)==0:
return
for url in urls:
self.add_new_url(url)
# 从新URL集合中获取一个URL,并将其添加到旧URL集合中
def get_url(self):
if self.has_new_url():
url=self.new_urls.pop()
self.old_urls.add(url)
return url
else:
return None

# 判断是否存在url
def has_new_url(self):
return len(self.new_urls)>0

if __name__=="__main__":
url_manager=UrlManager()
url_manager.add_new_url("url1")
url_manager.add_new_urls(["url1", "url2", "url3"])
print(f"{url_manager.new_urls},{url_manager.old_urls}")

print("*"*30)
new_urls=url_manager.get_url()
print(f"{url_manager.new_urls},{url_manager.old_urls}")

print("*" * 30)
new_urls = url_manager.get_url()
print(f"{url_manager.new_urls},{url_manager.old_urls}")

print("*" * 30)
new_urls = url_manager.get_url()
print(f"{url_manager.new_urls},{url_manager.old_urls}")

print("*" * 30)
new_urls = url_manager.get_url()
print(url_manager.has_new_url())

Beautiful Soup——网页解析器

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

创建如下测试html文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>网页标题</title>
</head>

<body>
<h1>标题1</h1>
<h2>标题2</h2>
<h3>标题3</h3>
<h4>标题4</h4>

<div id="content" class="default">
<p>段落</p>
<a href="http://www.baidu.com">百度</a> <br/>
<a href="http://www.crazyant.net">疯狂的蚂蚁</a><br/>
<a href="http://ww.iqiyi.com">爱奇艺</a> <br/>
<img src="https://www.python.org/static/img/python-logo.png"/>
</div>
</body>
</html>



效果如下:

使用bs4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from bs4 import BeautifulSoup

with open("./bs4_test.html", encoding="utf-8") as fin:
html_doc = fin.read()

soup = BeautifulSoup(html_doc,"html.parser")

div_node = soup.find('div', id="content")
print(div_node)
print("================================")
links = soup.find_all("a")

for link in links:
print(link.name,link["href"], link.get_text())

img = soup.find("img")
print(img["src"])


运行如下: