在本篇博客中,我们将使用selenium爬取新浪新闻中滚动页面的所有新闻内容,包括题目、时间、来源、正文,并存入MongoDB数据库。网址:https://news.sina.com.cn/roll。

打开后,发现这里都是一些滚动新闻,每隔1分钟就会刷新:

我们右键查看网页源代码,发现并没有当前页面的信息:

在源码页面搜索当前第一条新闻,并没有找到。

右键检查:

发现有当前页面的信息。说明当前页面是动态页面,即通过javascript渲染后得到的。因此,通过requests请求,是无法得到页面信息的,它得到的是网页最原始的代码,和右键查看网页源代码得到的是一致的。所以,我们需要使用selenium,模拟浏览器运行,来处理动态页面,从而爬取新闻信息。

程序主体框架如下:

import pymongoimport requests
from requests import RequestException
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementExceptiondef get_response(url):passdef get_news(link):# 获取新闻的详细信息passdef get_page_news():#获取当前页面所有新闻的urlpassif __name__ == '__main__':#连接mongodbclient = pymongo.MongoClient('mongodb://localhost:27017')#指定数据库db = client.News#指定集合news_col = db.sinaRollNews#打开浏览器browser = webdriver.Chrome()browser.implicitly_wait(10)#打开网址browser.get('https://news.sina.com.cn/roll/')#获取当前页面新闻的urlget_page_news()while True:try:#找到下一页按钮 并点击'''<a href="javascript:void(0)" onclick="newsList.page.next();return false;">下一页</a>'''browser.find_element_by_xpath('//a[@onclick="newsList.page.next();return false;"]').click()#获取下一页新闻的urlget_page_news()except NoSuchElementException:print("NoSuchElementException")browser.close()break

右键检查当前页面,查看新闻的url:

def get_page_news():#获取当前页面所有包含新闻的a标签news = browser.find_elements_by_xpath('//div[@class="d_list_txt"]/ul/li/span/a')for i in news:link = i.get_attribute('href') #得到新闻urlprint(link,i.text)if not news_col.find_one({'link':link}):  #通过url去重get_news(link)

获取页面的详细信息:

我们发现首页是动态页面,点击一条新闻进去之后的页面并不是动态页面,所以可以使用requests进行爬取。首先爬取每条新闻的页面信息。


def get_response(url):try:#添加User-Agent,放在headers中,伪装成浏览器headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:response.encoding = 'utf-8'return response.textreturn Noneexcept RequestException:return None

解析页面信息,获取每条新闻的详细信息:

新闻正文分布在下图div标签的每个p标签中:

def get_news(link):# 获取新闻的详细信息html = get_response(link)#使用beautifulsoup进行解析soup = BeautifulSoup(html,'lxml')#标题'''<h1 class="main-title">证监会要求北京银行说明是否串通*ST康得管理层舞弊</h1>'''title = soup.select('.main-title')#可能有小部分标题的标签不是上述格式 对其进行补充if not title:title = soup.select('#artibodyTitle')if title:title = title[0].textprint(title)#日期'''<span class="date">2019年07月20日 16:52</span>'''date = soup.select('.date')# 可能有小部分日期的标签不是上述格式 对其进行补充if not date:date = soup.select('#pub_date')if date:date = date[0].textprint(date)#来源'''<span class="source ent-source">中国证券报</span>'''source = soup.select('.source')# 可能有小部分来源的标签不是上述格式 对其进行补充if not source:source = soup.select('[data-sudaclick="media_name"]')if source:source = source[0].textprint(source)#正文article = soup.select('div[class="article"] p')# 可能有小部分正文的标签不是上述格式 对其进行补充if not article:article = soup.select('div[id="artibody"] p')if article:#把正文放在一个列表中 每个p标签的内容为列表的一项article_list = []for i in article:print(i.text)article_list.append(i.text)#转为字典格式news = {'link': link, 'title': title, 'date': date, 'source': source, 'article': article_list}news_col.insert_one(news)

爬取效果:

完整代码:

import pymongoimport requests
from requests import RequestException
from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementExceptiondef get_response(url):try:#添加User-Agent,放在headers中,伪装成浏览器headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:response.encoding = 'utf-8'return response.textreturn Noneexcept RequestException:return Nonedef get_news(link):# 获取新闻的详细信息html = get_response(link)#使用beautifulsoup进行解析soup = BeautifulSoup(html,'lxml')#标题'''<h1 class="main-title">证监会要求北京银行说明是否串通*ST康得管理层舞弊</h1>'''title = soup.select('.main-title')#可能有小部分标题的标签不是上述格式 对其进行补充if not title:title = soup.select('#artibodyTitle')if title:title = title[0].textprint(title)#日期'''<span class="date">2019年07月20日 16:52</span>'''date = soup.select('.date')# 可能有小部分日期的标签不是上述格式 对其进行补充if not date:date = soup.select('#pub_date')if date:date = date[0].textprint(date)#来源'''<span class="source ent-source">中国证券报</span>'''source = soup.select('.source')# 可能有小部分来源的标签不是上述格式 对其进行补充if not source:source = soup.select('[data-sudaclick="media_name"]')if source:source = source[0].textprint(source)#正文article = soup.select('div[class="article"] p')# 可能有小部分正文的标签不是上述格式 对其进行补充if not article:article = soup.select('div[id="artibody"] p')if article:#把正文放在一个列表中 每个p标签的内容为列表的一项article_list = []for i in article:print(i.text)article_list.append(i.text)#转为字典格式news = {'link': link, 'title': title, 'date': date, 'source': source, 'article': article_list}news_col.insert_one(news)def get_page_news():#获取当前页面所有包含新闻的a标签news = browser.find_elements_by_xpath('//div[@class="d_list_txt"]/ul/li/span/a')for i in news:link = i.get_attribute('href') #得到新闻urlprint(link,i.text)if not news_col.find_one({'link':link}):  #通过url去重get_news(link)if __name__ == '__main__':#连接mongodbclient = pymongo.MongoClient('mongodb://localhost:27017')#指定数据库db = client.News#指定集合news_col = db.sinaRollNews#打开浏览器browser = webdriver.Chrome()browser.implicitly_wait(10)#打开网址browser.get('https://news.sina.com.cn/roll/')#获取当前页面新闻的urlget_page_news()while True:try:#找到下一页按钮 并点击'''<a href="javascript:void(0)" onclick="newsList.page.next();return false;">下一页</a>'''browser.find_element_by_xpath('//a[@onclick="newsList.page.next();return false;"]').click()#获取下一页新闻的urlget_page_news()except NoSuchElementException:print("NoSuchElementException")browser.close()break

Python爬虫实战 | (13) 爬取新浪滚动新闻相关推荐

  1. python爬虫-使用BeautifulSoup爬取新浪新闻标题

    ** python爬虫-使用BeautifulSoup爬取新浪新闻标题 ** 最近在学习爬虫的技巧,首先学习的是较为简单的BeautifulSoup,应用于新浪新闻上. import requests ...

  2. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  3. 携程ajax,Python爬虫实战之爬取携程评论

    一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...

  4. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  5. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

  6. Python爬虫实战之爬取网站全部图片(一)

    Python爬虫实战之爬取网站全部图片(二) Python爬虫实战之通过ajax获得图片地址实现全站图片下载(三) 一.获得图片地址 和 图片名称 1.进入网址之后 按F12  打开开发人员工具点击e ...

  7. Python爬虫系列之爬取微信公众号新闻数据

    Python爬虫系列之爬取微信公众号新闻数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发 > 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流 ...

  8. python爬虫scrapy爬取新闻标题及链接_18Python爬虫---CrawlSpider自动爬取新浪新闻网页标题和链接...

    一.爬取新浪新闻思路 1.创建scrapy项目 2.分析新浪新闻网站静态页面代码 3.编写对应的xpath公式 4.写代码 二.项目代码 步骤1.创建scrapy项目 scrapy startproj ...

  9. Python爬虫实战:爬取解放日报新闻文章

    上一篇<Python 网络爬虫实战:爬取人民日报新闻文章>发布之后,确实帮到了不少朋友. 前几天,我好哥们问我:我想爬另一个日报新闻网站,网页结构几乎跟人民日报几乎一模一样,但是我用你的那 ...

  10. Python爬虫实战之爬取web网易云音乐——解析

    找到存储歌曲地址的url界面 首先我们要进入网易云的web页面在页面中我们随意选择一首歌曲,打开开发者工具查看响应的界面. 在这些页面中我们需要查找存储有音乐文件的url,这是我们可以打开全局搜索直接 ...

最新文章

  1. SLAM算法&技术之Gauss-Newton非线性最小二乘算法
  2. SA-SSD:阿里达摩院最新3D检测力作(CVPR2020)
  3. 未捕获ReferenceError:未定义$?
  4. goldengate for oracle 10g学习
  5. Java基础(三十五)Math、Random类和数字格式化(String.format方法)
  6. Angular html 页面里的井号 #
  7. WebSocket webshop后台服务器的一些全局数据结构
  8. Win10系统hosts文件不见了的解决方法
  9. 【es】Node与NodeEnvironment的实例化
  10. laravel无法运行php,Laravel:php artisan服务无法启动
  11. Javascript常用正则表达式汇总
  12. NBUT 1116 Flandre's Passageway (LIS变形)
  13. 如何保存浮点型数值的图像? (Python的/ PIL)
  14. 搭建VUE环境、安装npm、node.js
  15. zookeeper基本安装文档
  16. 推荐《与孩子一起学编程》,与孩子一起开启pathon编程之路吧
  17. jpg如何免费转换成pdf
  18. 网络渗透基本思路及方法
  19. 《C语言小游戏之贪吃蛇程序代码》
  20. 手机便签怎么对待办分类文件夹加密

热门文章

  1. 三极管、MOSE管的作用总结
  2. [dlang](一)利用dub搭建vibe.d,hibernated,mysql开发环境
  3. linux程序接口实验,实验 一 操作系统接口实验
  4. hyperledger fabric 测试(九)couch DB数据库设置
  5. Python 面向对象版学员管理系统
  6. 破解老程序员的迷茫病——JUST DO IT
  7. 2019杭电多校训练营(第一场)
  8. elementui Messagebox确认消息弹框中没有取消按钮
  9. 南京邮电大学网络攻防训练平台-逆向-Py交易
  10. Lab: Username enumeration via different responses:通过不同的响应来验证用户名是否正确复盘