python爬虫入门(理论)
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() #新增url 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) #新增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 def get_url(self): if self.has_new_url(): url = self.new_urls.pop() # 将url从new_urls中取出 self.old_urls.add(url) # 添加到已经访问过的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"]) 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"])