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"])