python爬虫
学习网站
一、准备
-
环境搭建
-
requests
-
beautifulsoup4
-
selenium
-
-
爬虫架构
-
URL管理器:管理URL,存储已爬取或待爬取的URL
-
网页下载器:破解网页,进行下载
-
网页解析器:对网页的HTML样式、连接的URL等进行解析
二、架构详解
-
request网页下载器
-
request:发送请求
-
response:返回数据
-
-
requests的使用
- url输入
- requests.get(url)获取
- status_code判断200/400
- headers获取各关键字段,encoding获取或修改编码类型,r.text获取文本
-
URL管理器
-
对外接口:URL的获取和新增
-
逻辑:取出时状态变成已爬取,新增时判断存在
-
数据存储:
-
-
URL管理器代码实现
-
整体思路:
- 初始化:新旧路由列表存储
- 新增URL:判断路由是否在新旧列表里,否add
- 新增URL列表:判断路由是否存在,后循环调用↑
- 获取URL:将url从新路由列表中取出并存入旧路由列表后返回此url
- 判断URL是否已经存在:返回新列表长度>0
-
代码实现
class UrlManager:"""url路由器"""# 初始化def __init__(self):self.new_urls = set()self.old_urls = set()#新增urldef add_new_url(self,url):if url is None or len(url) == 0:returnif url in self.new_urls or url in self.old_urls:returnself.new_urls.add(url)#新增url列表(批量)def add_new_urls(self,urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)#获取一个urldef get_url(self):if self.has_new_url():url = self.new_urls.pop() # 将url从new_urls中取出self.old_urls.add(url) # 添加到已经访问过的url中return urlelse: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"])print(url_manager.new_urls,url_manager.old_urls)print("#"*30)new_url = url_manager.get_url()print(url_manager.new_urls,url_manager.old_urls)print("#" * 30)new_url = url_manager.get_url()print(url_manager.new_urls, url_manager.old_urls)print("#" * 30)new_url = url_manager.get_url()print(url_manager.new_urls, url_manager.old_urls)
-
-
Beaytifulsoup解析HTML的实例
- test.heml文件
<!DOCTYPE html> <html lang="en"> <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://www.igiyi.com">爱奇艺</a> <br/><img src="https://ww.python.org/static/img/python-logo.png"/> </div> </body> </html>
- test.py
from bs4 import BeautifulSoup# 读取html文件,不用关闭 with open('./test.html',encoding='utf-8') as fin:html_doc = fin.read()# 创建BeautifulSoup对象 soup = BeautifulSoup(html_doc,"html.parser")# 定位,查找div标签 div_node = soup.find("div",id="content") print(div_node)#检查print("#"*10)# 查找div标签下的所有a标签 links = div_node.find_all('a') for link in links:print(link.name,link["href"],link.get_text())# 查找div标签下的img标签 img = div_node.find("img") print(img["src"])