面向对象封装
Google 页面 Serp p 经常 会 会 遇到 一些 小 调整 调整 调整 调整 调整 调整 我们 代码 代码 代码 必然 要 经常 经常 进行 更新 更新 更新 更新 更新 我们 就 就 需要 保证 保证 代码 代码 的 简洁性 简洁性. 在 这 个 项目 中 中 我们 把握 个 个 : : : 对象 : : 对象 : : : : : : : : : 个 个 个는지
那么什么是面向对象?
class GoogleSpider(object):
def __get_total_page(self):
pass
def search_text(self):
pass
def search_videos(self):
pass
def search_wiki(self):
pass
...
这 这 代码 代码 代码 代码 是 是 将 我们 刚刚 写出 的 的 函数 封装 在 在 一 一 个 个 个 googlespider 类 中 中 中 中 看似 是 用 用 用 了 面向 面向 对象 的 写法 写法 写法 写法 中 中 的 方法 和 数据 并 并 并 没有 没有 发生 发生 关联 关联 还 再 再 进一步 进一步 进一步 进一步 进一步. 中 的 的 的 中 中 中 中 中 中 的 的 的 的 的 的 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 用 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 中 用 用 用 用 了 了 面向 对象 对象 的 写法 写法 写法 类 中 中 中 中 中 中 用 인
前文中,我们的输出会输出爬取内容的内容,即
type
字段.在这里,我们类中提前定义四种类型.
完整的面向对象代码,如下所示:
class GoogleSpider(AttribDict):
__exclude_keys__ = {'soup'}
def __init__(self, soup: BeautifulSoup):
self.videos = []
self.wiki = []
self.page = 0
self.news = []
self.main = []
self.soup = soup
def __get_total_page(self):
"""获取当前页面总数"""
pages_ = self.soup.find('span', id='xjs').findAll('td')
maxn = 0
for p in pages_:
try:
if int(p.text) > maxn:
maxn = int(p.text)
except:
pass
self.page = maxn
def __search_main(self):
"""解析主要搜索结果"""
# 获取所有的主要搜索结果
result_containers = self.soup.findAll('div', class_='g')
for container in result_containers:
# title提取
try:
title = container.find('h3').text
# 对应链接提取
url = container.find('a')['href']
# 对应描述提取
des = container.find('span', class_='aCOpRe').text
self.main.append({
'title': title,
'url': url,
'des': des,
})
except Exception:
continue
def __search_wiki(self):
"""解析wiki内容"""
container = self.soup.find('div', class_='kp-wholepage')
# 如果container为None,则返回空列表
if container is None:
return []
# Title
title = container.find('h2', attrs={'data-attrid': 'title'}).find('span').text
# Subtitle
try:
subtitle = container.find(
'div', attrs={'data-attrid': 'subtitle'}).text
except AttributeError:
subtitle = None
# Description
des = container.find('div', class_='kno-rdesc').find('span').text
# 获取Wiki链接
url = container.find('div', class_='kno-rdesc').find('a')['href']
# Details内容
try:
# div.wp-ms对应不同的四个card
table = container.findAll(
'div', class_='wp-ms')[2].findAll('tr', class_='kno-nf-nr')[1:]
except IndexError:
table = []
details = []
for row in table:
name = row.find('span').text.strip(': ')
detail_ = row.findAll('span')[1:]
detail = ''
for _ in detail_:
detail += _.text + ' ' # 以 key value的形式输出结果
details.append({
'name': name,
'detail': detail.strip()
})
result = {
'title': title,
'subtitle': subtitle,
'des': des,
'url': url,
'details': details,
}
self.wiki = [result]
def __search_news(self):
try:
cards = self.soup.find('g-scrolling-carousel').findAll('g-inner-card')
except AttributeError:
return []
for card in cards:
title = card.find('div', role='heading').text
href = card.find('a')['href']
result = {
'title': title,
'href':href,
}
self.news.append(result)
def __search_videos(self):
try:
cards = self.soup.find('div', id='search').findAll('div', class_='VibNM')
except AttributeError:
return []
for card in cards:
title = card.find('div', role='heading').text
href = card.find('a')['href']
result = {
'title': title,
'href':href,
}
self.videos.append(result)
def search(self):
self.__get_total_page()
self.__search_main()
self.__search_news()
self.__search_videos()
self.__search_wiki()
spider = GoogleSpider(soup)
spider.search()
可以 可以 可以 可以 可以 面向 面向 对象 的 之后 之后 之后 之后 最 的 的 的 就 是 注释 变少 变少 变少 变少 变少 是 输入 输入 和 和 和 输出 都 不 不 需要 需要 显示 指定 了 了 我们 可以 使用 更加 多 的 的 设计 设计 模式 来 进一步 进一步 完善 我们 我们 这个
GoogleSpider
类.
Reference
이 문제에 관하여(面向对象封装), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fiveeng/-h0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)