用python爬取新闻_Python爬虫爬取新闻资讯案例详解

前言

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

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

202007140906031.jpg

应用到的库

requests,time,re,UserAgent,etree

import requests,time,re

from fake_useragent import UserAgent

from lxml import etree

列表页面

202007140906033.jpg

列表页,链接xpath解析

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

详情页

202007140906034.jpg

202007140906045.jpg

内容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

程序运行效果

202007140906046.gif

程序采集效果

202007140906047.jpg

附源码参考:

# -*- 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)

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值