Python爬虫爬取新闻资讯案例详解


Posted in Python onJuly 14, 2020

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

一个简单的Python资讯采集案例,列表页到详情页,到数据保存,保存为txt文档,网站网页结构算是比较规整,简单清晰明了,资讯新闻内容的采集和保存!

Python爬虫爬取新闻资讯案例详解

应用到的库

requests,time,re,UserAgent,etree

import requests,time,re
from fake_useragent import UserAgent
from lxml import etree

列表页面

Python爬虫爬取新闻资讯案例详解

列表页,链接xpath解析

href_list=req.xpath('//ul[@class="news-list"]/li/a/@href')

详情页

Python爬虫爬取新闻资讯案例详解

Python爬虫爬取新闻资讯案例详解

内容xpath解析

h2=req.xpath('//div[@class="title-box"]/h2/text()')[0]
author=req.xpath('//div[@class="title-box"]/span[@class="news-from"]/text()')[0]
details=req.xpath('//div[@class="content-l detail"]/p/text()')

内容格式化处理

detail='\n'.join(details)

标题格式化处理,替换非法字符

pattern = r"[\/\\\:\*\?\"\<\>\|]"
new_title = re.sub(pattern, "_", title) # 替换为下划线

保存数据,保存为txt文本

def save(self,h2, author, detail):
with open(f'{h2}.txt','w',encoding='utf-8') as f:
f.write('%s%s%s%s%s'%(h2,'\n',detail,'\n',author))

print(f"保存{h2}.txt文本成功!")

遍历数据采集,yield处理

def get_tasks(self):
data_list = self.parse_home_list(self.url)
for item in data_list:
yield item

程序运行效果

Python爬虫爬取新闻资讯案例详解

程序采集效果

Python爬虫爬取新闻资讯案例详解

附源码参考:

# -*- coding: UTF-8 -*-

import requests,time,re
from fake_useragent import UserAgent
from lxml import etree

class RandomHeaders(object):
  ua=UserAgent()
  @property
  def random_headers(self):
    return {
      'User-Agent': self.ua.random,
    }

class Spider(RandomHeaders):
  def __init__(self,url):
    self.url=url


  def parse_home_list(self,url):
    response=requests.get(url,headers=self.random_headers).content.decode('utf-8')
    req=etree.HTML(response)
    href_list=req.xpath('//ul[@class="news-list"]/li/a/@href')
    print(href_list)
    for href in href_list:
      item = self.parse_detail(f'https://yz.chsi.com.cn{href}')
      yield item


  def parse_detail(self,url):
    print(f">>正在爬取{url}")
    try:
      response = requests.get(url, headers=self.random_headers).content.decode('utf-8')
      time.sleep(2)
    except Exception as e:
      print(e.args)
      self.parse_detail(url)
    else:
      req = etree.HTML(response)
      try:
        h2=req.xpath('//div[@class="title-box"]/h2/text()')[0]
        h2=self.validate_title(h2)
        author=req.xpath('//div[@class="title-box"]/span[@class="news-from"]/text()')[0]
        details=req.xpath('//div[@class="content-l detail"]/p/text()')
        detail='\n'.join(details)
        print(h2, author, detail)
        self.save(h2, author, detail)
        return h2, author, detail
      except IndexError:
        print(">>>采集出错需延时,5s后重试..")
        time.sleep(5)
        self.parse_detail(url)


  @staticmethod
  def validate_title(title):
    pattern = r"[\/\\\:\*\?\"\<\>\|]"
    new_title = re.sub(pattern, "_", title) # 替换为下划线
    return new_title



  def save(self,h2, author, detail):
    with open(f'{h2}.txt','w',encoding='utf-8') as f:
      f.write('%s%s%s%s%s'%(h2,'\n',detail,'\n',author))

    print(f"保存{h2}.txt文本成功!")
  def get_tasks(self):
    data_list = self.parse_home_list(self.url)
    for item in data_list:
      yield item
if __name__=="__main__":
  url="https://yz.chsi.com.cn/kyzx/jyxd/"
  spider=Spider(url)
  for data in spider.get_tasks():
    print(data)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python出现segfault错误解决方法
Apr 16 Python
解决Linux系统中python matplotlib画图的中文显示问题
Jun 15 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
在Python 的线程中运行协程的方法
Feb 24 Python
python 画条形图(柱状图)实例
Apr 24 Python
python Django 反向访问器的外键冲突解决
May 20 Python
Django框架请求生命周期实现原理
Nov 13 Python
python 解决微分方程的操作(数值解法)
May 26 Python
Django框架之路由用法
Jun 10 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 #Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 #Python
python操作微信自动发消息的实现(微信聊天机器人)
Jul 14 #Python
python如何写try语句
Jul 14 #Python
Python操作MySQL数据库的示例代码
Jul 13 #Python
Python基于正则表达式实现计算器功能
Jul 13 #Python
python输出结果刷新及进度条的实现操作
Jul 13 #Python
You might like
PHP查看当前变量类型的方法
2015/07/31 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
2020/08/06 PHP
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
windows下python安装小白入门教程
2018/09/18 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
英国领先的汽车轮胎和快速健康中心:Kwik Fit
2017/10/29 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
介绍一下Mysql的存储引擎
2015/02/12 面试题
简短的公司员工自我评价分享
2013/11/13 职场文书
班组长岗位职责
2014/03/03 职场文书
客户答谢会活动方案
2014/08/31 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
Pandas 数据编码的十种方法
2022/04/20 Python
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL