python爬虫--类级别写法
Posted 南岸青栀*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫--类级别写法相关的知识,希望对你有一定的参考价值。
类级别写法爬取糗事百科段子
前文回顾
python爬虫–爬取9某1看剧网电视剧
python爬虫–爬取网易云音乐评论
python爬虫–scrapy(再探)
python爬虫–scrapy(初识)
python爬虫–selenium模块
文章目录
思路:
模块化
需要的模块有
-
发送请求
- 主要功能:向URL发送请求,获取响应页面
-
数据解析
- 主要功能:解析页面中的所需要的urls和所需要的内容
-
数据存储
- 主要功能:存储数据解析后的内容
-
URL管理器
- 主要功能:管理urkl,包括:添加新url,urls ,获取url,获取还有多少url需要爬取,获取是否还有url需要爬取
-
调度器
- 主要功能:协调多个模块之间运行
例子:爬取糗事百科段子
代码
from fake_useragent import UserAgent
import requests
from lxml import etree
# 发送请求
class Downloader():
def do_download(self,url):
print(url)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
}
resp = requests.get(url=url,headers=headers)
if resp.status_code == 200:
return resp.text
#数据解析
class Parser():
def do_parse(self,html):
tree = etree.HTML(html)
contents = [ div.xpath("string(.)").strip() for div in tree.xpath('//div[@class="content"]')]
urls =['https://www.qiushibaike.com{}'.format(url) for url in tree.xpath('//ul[@class="pagination"]/li/a/@href')]
return contents,urls
# 数据保存
class DataOutPut():
def do_save(self,datas):
with open("./duanzi.txt",'a',encoding='utf-8') as fp:
for data in datas:
fp.write(data+'\\n')
# URL管理器
class URLManager():
def __init__(self):
self.new_url = set()
self.old_url = set()
# 加入一个url
def add_url(self,url):
if url is not None and url and url not in self.old_url:
self.new_url.add(url)
# 加入多个url
def add_urls(self,urls):
for url in urls:
self.add_url(url)
# 获取一个url
def get_new_url(self):
url = self.new_url.pop()
self.old_url.add(url)
return url
# 获取还有多少url需要爬取
def get_new_url_size(self):
return len(self.new_url)
# 获取是否还有url需要爬取
def is_have_new_url(self):
return self.get_new_url_size() > 0
#调度器
class Scheduler():
def __init__(self):
self.download = Downloader()
self.parse = Parser()
self.data_out_put = DataOutPut()
self.url_manager = URLManager()
def start(self,url):
self.url_manager.add_url(url)
while self.url_manager.is_have_new_url():
url = self.url_manager.get_new_url()
html = self.download.do_download(url)
datas,urls = self.parse.do_parse(html)
self.data_out_put.do_save(datas)
self.url_manager.add_urls(urls)
if __name__ == '__main__':
scheduler = Scheduler()
url = 'https://www.qiushibaike.com/text/'
scheduler.start(url)
效果图
以上是关于python爬虫--类级别写法的主要内容,如果未能解决你的问题,请参考以下文章