python3网络爬虫开发实战第二版——14
GitHub
基础
详情页
url:https://news.ifeng.com/c/8COcKDt6PTg
提取title
from lxml.html import HtmlElement, fromstring
# 将html代码里面的字符转化为lxml里面的HtmlElement对象
html = open('detail.html', encoding='utf-8').read()
element = fromstring(html=html)
# xpath从meta节点中提取标题的规则
METAS = [
'//meta[starts-with(@property,"og:title")]/@content',
'//meta[starts-with(@name,"og:title")]/@content',
'//meta[starts-with(@property,"title")]/@content',
'//meta[starts-with(@name,"title")]/@content',
'//meta[starts-with(@property,"page:title")]/@content',
]
def extract_by_meta(element: HtmlElement) -> str:
for xpth in METAS:
title = element.xpath(xpth) # 返回匹配得到的数据,匹配不成功返回None
if title:
return ''.join(title)
def extract_by_title(element: HtmlElement):
return ''.join(element.xpath('//title//text()')).strip()
def extract_by_h(element: HtmlElement):
hs = element.xpath('//h1//text()|//h2//text()|//h3//text()') # 返回一个列表
return hs or []
# title_extracted_by_meta=extract_by_meta(element)
# title_extracted_by_h=extract_by_h(element)
# title_extracted_by_title=extract_by_title(element)
#
# print(title_extracted_by_meta)
# print(title_extracted_by_h)
# print(title_extracted_by_title)
"""
美“2022国防授权法案”含多项涉华消极条款 国防部回应
['美“2022国防授权法案”含多项涉华消极条款 国防部回应', '为您推荐', '精品有声', '好书精选']
美“2022国防授权法案”含多项涉华消极条款 国防部回应_凤凰网
"""
"""
最基本的字符串相似度算法 Jaccard算法
用两个字符串的交集字符数量除以两个字符串的并集字符数量
如果s1和s2完全相同,则返回1
如果s1和s2毫不相干,则返回0
局限性:没有考虑字符的数量和重复度
"""
def similarity(s1, s2):
if not s1 or not s2:
return 0
s1_set = set(list(s1)) # 将字符拆分成集合
s2_set = set(list(s2))
intersection = s1_set.intersection(s2_set)
union = s2_set.intersection(s2_set)
return len(intersection) / len(union)
# 提取title
def extract_title(element: HtmlElement):
title_extracted_by_meta = extract_by_meta(element)
title_extracted_by_h = extract_by_h(element)
title_extracted_by_title = extract_by_title(element)
if title_extracted_by_meta:
return title_extracted_by_meta
title_extracted_by_h = sorted(title_extracted_by_h,
key=lambda x: similarity(x, title_extracted_by_title),
reverse=True)
if title_extracted_by_h:
return title_extracted_by_h[0]
return title_extracted_by_title
print(extract_title(element))
# 美“2022国防授权法案”含多项涉华消极条款 国防部回应
调包
注意:gerapy-auto-extractor 0.2.0 requires scikit-learn>=0.23.1
from gerapy_auto_extractor import extract_detail
from gerapy_auto_extractor.helpers import content,jsonify
html=content('detail.html')
print(jsonify(extract_detail(html)))
{
"title": "美“2022国防授权法案”含多项涉华消极条款 国防部回应",
"datetime": "2021-12-30 15:08:52",
"content": "12月30日下午,国防部举行例行记者会,国防部新闻局副局长、国防部新闻发言人谭克非大校答记者问。\n记者:\n美国当地时间12月27日,美总统签署“2022年国防授权法案”,其中包括多项涉华内容,请问发言人对此有何评论?\n谭克非:\n美近日出台包含多项涉华消极条款的“2022年国防授权法案”。该法案充斥冷战思维和意识形态偏见,渲染“中国威胁论”,极力抹黑中国国防政策和军力发展,在台湾、涉疆等问题上对中方无端指责,鼓噪在亚太、拉美等地区加强对华遏制,煽动开展对华经贸、科技竞争,诋毁中国同有关国家正常交流合作。该法案严重干涉中国内政,严重损害中国国家主权、安全、发展利益,严重损害中美互信,严重毒化中美两国两军关系,中方对此表示强烈不满和坚决反对。\n中国一贯坚持和平发展道路和防御性国防政策,始终是世界和平的建设者、全球发展的贡献者、国际秩序的维护者、公共产品的提供者。反观美方,多年来频繁对他国发动战争,造成大量平民伤亡和流离失所,是地区和世界和平与稳定的最大威胁。美方粗暴干涉中国内政、渲染中国威胁、抹黑中国发展、强调对华竞争,实际上是在把两国两军关系带入危险的境地。\n中方敦促美方摒弃零和博弈观念,客观理性看待中国国防和军队建设,停止出台敌视性对华政策,停止将中方塑造成为美方的对手甚至敌人,多做有利于两国两军关系健康稳定发展的事。"
}
列表页
url:https://news.ifeng.com/
调包
from gerapy_auto_extractor import extract_list
from gerapy_auto_extractor.helpers import content,jsonify
html=content('list.html')
print(jsonify(extract_list(html)))
[
{
"title": "今年940余架次军机进入台“空域”?国防部:只多不少",
"url": "http://mil.ifeng.com/c/8COiCgCf1Xe"
},
{
"title": "男子护妹持锹拍死妹夫获无罪诉请返还赔偿金再次被驳",
"url": "http://news.ifeng.com/c/8COgLGB8IJh"
},
{
"title": "赵立坚:在座外国记者能在疫情期间生活在中国你们就偷着乐吧",
"url": "http://news.ifeng.com/c/8COiI9rhKWU"
},
...
]
智能辨别列表页和详情页
from gerapy_auto_extractor import is_detail, is_list, probability_of_list, probability_of_detail
from gerapy_auto_extractor.helpers import content, jsonify
html = content('detail.html')
print(probability_of_detail(html),probability_of_list(html))
print(is_detail(html),is_list(html))
html = content('list.html')
print(probability_of_detail(html),probability_of_list(html))
print(is_detail(html),is_list(html))
'''
0.9960569412361125 0.003943058763887429
True False
0.008709616361285866 0.9912903836387141
False True
'''