大家好,作为一名互联网行业的小白,写博客只是为了巩固自己学习的知识,但由于水平有限,博客中难免会有一些错误出现,有不妥之处恳请各位大佬指点一二!
博客主页:链接: https://blog.csdn.net/weixin_52720197?spm=1018.2118.3001.5343
1.导入所需要的包
from fake_useragent import UserAgent
import requests
from lxml import etree
2.设计框架
# 发送请求
class Downloader():
def do_download(self, url):
headers = {'User-Agent': UserAgent().chrome}
# 做出相应
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
resp.encoding = 'utf-8'
return resp.text
# 数据解析
class Parser():
def do_parse(self, html):
pass
# 数据保存
class DataOutPut():
def do_save(self, datas):
pass
# URL管理器
class URLManager():
def __init__(self):
# 需要爬的
self.new_url = set()
# 已经爬的
self.old_url = set()
# 加入一个Url
def add_new_url(self, url):
#严谨url不能为空,不能为空字符串,也不能在爬取过的url里面
if url is not None and url != '' and url not in self.old_url:
self.new_url.add(url)
# 加入多个Url
def add_new_urls(self, urls):
for url in urls:
# 判断,直接调用上面的方法
self.add_new_url(url)
# 获取一个Url
def get_new_url(self):
# 取出一个url并删除,pop表示删除
url = self.new_url.pop()
# 将用完的url加入old中,用来判断是否用过
self.old_url.add(url)
return url
# 获取还有多少个Url要爬取
def get_new_url_size(self):
return len(self.new_url)
# 获取是否还有Url要爬取
def have_new_url(self):
return self.get_new_url_size() > 0
#数据调度器,调度四个个类
class Scheduler:
def __init__(self):
# 下载器
self.downloader = Downloader()
# 解析器
self.parser = Parser()
self.data_out_put = DataOutPut()
self.url_manger = URLManager()
def start(self, url):
self.url_manger.add_new_url(url)
while self.url_manger.have_new_url():
url = self.url_manger.get_new_url()
html = self.downloader.do_download(url)
datas, urls = self.parser.do_parse(html)
self.data_out_put.do_save(datas)
self.url_manger.add_new_urls(urls)
if __name__ == '__main__':
pass