网页新闻抓取(【每日一题】如何爬取实际的新闻页面的具体内容观察)
优采云 发布时间: 2021-10-07 23:25网页新闻抓取(【每日一题】如何爬取实际的新闻页面的具体内容观察)
前言
前面的文章()主要是抓取首页的新闻列表而不是具体的新闻内容。本文将具体分析如何抓取实际新闻页面的具体内容
观察图中的新闻列表,你会发现一共有三种新闻。点进去可以发现三个新闻的页面类型不同。这里只选择性抓取类似于第一条新闻的类型,其他两种抓取方式类似,大家可以自己实践一下--_--
页面分析
一条新闻的内容无外乎三种:视频、图片、文字。以下是收录所有三个内容供分析的页面,链接如下:
打开控制台,视频一般会放在文章的顶部,id为tupian_div的div标签中(这里有坑,后面会讲...),文字会放在类left_zw的div标签在p标签中,图片会混在p标签中
视频部分的抓取
根据上一篇文章使用xpath解析html,视频主要在div下的source标签,尝试爬取地址
显然是孤独的爬上去的。. .
基本上可以判断视频是通过js动态加载的。如何处理这种情况会在下面的博客中讨论,因为内容还是比较大的。
这里的解决方法:div下面的第三个script标签里面有一个视频地址,有点推测。
提取视频地址的具体代码:
videos = news_demo.xpath('//div[@id="tupian_div"]//script')
videos_script = str(videos[2].xpath('text()'))
videos_address = videos_script[videos_script.find('source') + 11:videos_script.find('type=video/mp4') - 1]
这是针对有视频的新闻,所以需要判断新闻中是否有视频。
具体内容和图片抓取
ps = news_demo.xpath('//div[@class="left_zw"]/*')
for p in ps:
if len(p.xpath('img')) > 0:
print(p.xpath('img/@src')[0])
else:
if not p.xpath('text()'):
continue
for text in p.xpath('text()'):
print(text)
应该没有太多代码来解释。xpath的语法在上一篇博客中。
完整代码
def get_real_news(href):
# 采用get方法获取响应
resp = requests.get(href)
# 为防止获取的网页乱码,对响应内容进行重新编码,编码格式可能是utf-8或gbk
html_content = resp.content.decode('utf-8', 'replace')
news_demo = html.etree.HTML(html_content)
# 视频链接爬取
videos = news_demo.xpath('//div[@id="tupian_div"]//script')
if len(videos) == 3: # 判断是否有视频
videos_script = str(videos[2].xpath('text()'))
videos_address = videos_script[videos_script.find('source') + 11:videos_script.find('type=video/mp4') - 1]
print(videos_address)
# 正文内容获取
ps = news_demo.xpath('//div[@class="left_zw"]/*')
for p in ps:
if len(p.xpath('img')) > 0: # 判断p标签中是否嵌入图片
print(p.xpath('img/@src')[0])
else:
if not p.xpath('text()'):
continue
for text in p.xpath('text()'):
print(text)
完成
总结
这只是一个抓取新闻页面的例子。或许可以抓取部分同类型新闻页面,但无法保证每条新闻的内容都能被正确抓取。你还是需要足够的材料来试水,慢慢调试,提高复用性。
我这里只抓取了正文内容。你可以尝试自己解析,也可以尝试爬取其他类型的新闻。您还可以尝试在获取内容时添加标签,例如强标签中的文本。, 那么如果要渲染网页上的内容,可以使用strong标签。