笔者在大一时曾系统学习过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) def get_url(self): if self.has_new_url(): url=self.new_urls.pop() self.old_urls.add(url) return url else: return None
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"])
|
运行如下: