爬虫:爬取新闻内容及图片,存入数据库

news/2024/4/28 3:21:35

目录

一、需求

二、代码


一、需求

1、对新闻主页上的新闻进行爬取,要求解析出标题、内容、新闻类型、图片并存入数据库。

2、只爬取带有图片的新闻,一张即可。

二、代码

以下是对新华网爬取的代码示例。

import requests as rq
from bs4 import BeautifulSoup
import re,os
import datetime
from datetime import timedelta
from difflib import SequenceMatcher
from gbase import GBASE_DB 
from conf import IMGPATH,LOCALPATH,PICSIZExinhua_dict = {'politics':1, #时政'culture':2, #文化'health':3,  #健康'fortune':4,  #财经'world':5,  #国际}def classify_news(s, news_list):for li in news_list:if li in s:return lireturn Nonedef get_xinhua_news(url):'''爬取新华网标题、内容、分类、图片'''newsWeb = rq.get(url)newsWeb.encoding = 'utf-8'soup = BeautifulSoup(newsWeb.text,'html.parser')#获取标题title_element = soup.find('span', class_='title')title = title_element.get_text(strip=True)#获取分类news_type = xinhua_dict[classify_news(url,xinhua_dict.keys())]#获取内容content_element = soup.find('div', id='detail')paragraphs = content_element.find_all('p')content = '\n'.join(paragraph.get_text(strip=True) for paragraph in paragraphs)content = re.sub('\n+', '\n', content).replace('"', '\\"').replace('\n', '\\n')#获取图片jpg_element = soup.find_all('img')jpg_pattern = re.compile(r'src="([^"]*1n\.(jpg|jpeg))"')j_list = jpg_pattern.findall(str(jpg_element))for j in j_list:jpg_path = os.path.basename(j[0])jpg_url = url[:url.find('c_')] + jpg_pathpicture = rq.get(jpg_url)if picture.status_code==200:if len(picture.content)>PICSIZE:with open(LOCALPATH+jpg_path,"wb") as f:f.write(picture.content)return_path = IMGPATH+jpg_pathbreakelse:passreturn title,news_type,content,return_pathdef main():db = GBASE_DB()newsUrl = 'http://www.xinhuanet.com/'newsWeb = rq.get(newsUrl)newsWeb.encoding = 'utf-8'soup = BeautifulSoup(newsWeb.text,'lxml')#获取新闻网址列表link_list = []li_elements = soup.find_all('li')for li_element in li_elements:a_element = li_element.find('a')if a_element:url = a_element.get('href')if url.startswith("http://www.news.cn/") and url.endswith(".htm") and 'c_' in url and classify_news(url,xinhua_dict.keys())!=None:link_list.append(url)#逐个解析新闻网址for link in link_list:try:title,news_type,content,jpg_path = get_xinhua_news(link)sql = '''insert into table_name(title,type,content,image) values ('{}', {},'{}','{}')'''.format(title,news_type,content,jpg_path)db.execute_sql(sql)print('(成功)爬取新华网:',title)except Exception as e:print('爬取失败:',link,' :',e)continueif __name__ == '__main__':main()

首先,对新华网主页进行爬取,获取页面上所有的新闻链接,存放进入link_list列表中。

然后,依次访问每一个新闻链接,并解析标题、内容,需要对空格、特殊字符等做一下清洗。根据子频道路径进行分类,并爬取像素值大于阈值的图片(避免爬取到页面上的二维码等小图),图片保存在服务器本地某个文件夹下,如果没有符合条件的图片,则会报错,在main函数中抛出异常,跳过此新闻链接的爬取。

最后,存入数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PWM驱动直流电机

接线图项目结构 PWM.C #include "stm32f10x.h" // Device headervoid PWM_Init(void){// 开启时钟,这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// GPIO初始化代码/*开启时钟*/RCC_APB2PeriphClockCmd(R…

下载chromedrive,使用自动化

1、先看一下自己浏览器的版本 2、访问 https://googlechromelabs.github.io/chrome-for-testing/

外包干了9天,技术退步明显。。。。。

先说一下自己的情况,本科生,2018年我通过校招踏入了南京一家软件公司,开始了我的职业生涯。那时的我,满怀热血和憧憬,期待着在这个行业中闯出一片天地。然而,随着时间的推移,我发现自己逐渐陷入…

【Unity】程序创建Mesh(二)MeshRenderer、光照、Probes探针、UV信息、法线信息

文章目录 接上文MeshRenderer(网格渲染器)Materials(材质)Material和Mesh对应Lighting光照Lightmapping材质中的光照 光源类型阴影全局光照Probes(探针)Ray Tracing(光线追踪)Additi…

mysql与redis数据测试

题目要求 1.新建一张user表,在表内插入10000条数据。 2.①通过jdbc查询这10000条数据,记录查询时间。 ②通过redis查询这10000条数据,记录查询时间。 3.再次查询这一万条数据,要求根据年龄进行排序,mysql和redis各实现…

深入理解计算机系统学习笔记

1.存储器层次结构 存储技术:不同存储技术的访问时间差异很大。速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小。CPU和主存之间的速度差距在增大。 计算机软件:一个编写良好的程序倾向于展示出良好的局部性。 硬件和软件的这…