100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Python爬虫新浪新闻网【使用selenium获取JS加载的动态数据】

Python爬虫新浪新闻网【使用selenium获取JS加载的动态数据】

时间:2024-02-20 13:16:13

相关推荐

Python爬虫新浪新闻网【使用selenium获取JS加载的动态数据】

1 requests爬取网站html文本

使用requests模块的get方法,直接爬取新浪网站的html文本:需要注意的是

res.encoding = "utf-8",而不是res.encoding ('utd-8')get请求得到的响应是requests类型的。它具有.text的方法,来获取整个html的内容

import requestsres = requests.get("/china/")res.encoding = 'utf-8'print(type(res))print(res.text[:500])

html文本只显示了前500个字符,结果是:

<class 'requests.models.Response'><!DOCTYPE html><html><head><meta http-equiv="Content-type" content="text/html; charset=utf-8" /><title>国内新闻_新闻中心_新浪网</title><meta name="keywords" content="国内时政,内地新闻"><meta name="description" content="新闻中心国内频道,纵览国内时政、综述评论及图片的栏目,主要包括时政要闻、内地新闻、港澳台新闻、媒体聚焦、评论分析。"><meta name="robots" content="noarchive"><meta name="Baiduspider" content="noarchive"><meta http-equiv="Cache-Control" content="no-transform"><meta http-equiv="Cache-Control" content="no-siteapp"><meta name="applicable-devi

2 BeautifulSoup模块解析HTML文本

使用BeautifulSoup的方法,可以解析HTML的文本信息,下面是一段我们自己写的HTML的字符串,通过BeautifulSoup方法,将该HTML字符串解析为bs4.BeautifulSoup类型,需要注意的是:

这个HTML的字符串格式非常严谨,不能多一个空格,之前打的时候,多了一个空格,然后BeautifulSoup解析的时候解析不成功,显示结果为None。BeautifulSoup解析方法,需要自己添加 html.parser的解析器,否则找不到解析器,打印警告信息。从结果可以看出:get请求得到的响应是requests类型的;BeautifulSoup解析后返回的是bs4.BeautifulSoup类型的。运行结果可以看出bs4.BeautifulSoup类型的也有text的方法,而且该方法挺强大的。他可以去除没有用的周边信息,直接获取文本信息。

from bs4 import BeautifulSoup##读入BeautifulSouphtml_sample = '\<html> \<body> \<h1 id="title">hello world</h1> \<a herf="#" class="link">This is link1</a> \<a herf="# link2" class="link">This is link2</a> \</body> \</html> 'soup = BeautifulSoup(html_sample,'html.parser')print(soup)print(soup.text)

结果为:

<class 'bs4.BeautifulSoup'>hello world This is link1 This is link2

虽然bs4.BeautifulSoup的text方法很强大,单有时,我们的信息存在特殊的标签之中,如何让才能获取到它们的值?

3BeautifulSoup常用的方法

(1)找出含有某个标签的方法

使用select找出含有 h1标签的元素 ;因为同一个标签的元素可能很多,因此select回传的是一个list打[0]只剩下beautifulsoup的一个物件而如果进阶把后面的文字打出来,就用.text的方法

from bs4 import BeautifulSoup##读入BeautifulSouphtml_sample = '\<html> \<body> \<h1 id="title">hello world</h1> \<a herf="#" class="link">This is link1</a> \<a herf="# link2" class="link">This is link2</a> \</body> \</html> 'soup = BeautifulSoup(html_sample,'html.parser')#使用select找出含有 h1标签的元素 ;header = soup.select('h1')print(header)print(soup.select('h1')[0])print(soup.select('h1')[0].text)#使用select找出含有 a 标签的元素links = soup.select('a')print(links)##如果要将这列表中的元素取出来,就用for循环for link in links:print(link)print(link.text)

运行结果是:

[<h1 id="title">hello world</h1>]<h1 id="title">hello world</h1>hello world[<a class="link" herf="#">This is link1</a>, <a class="link" herf="# link2">This is link2</a>]<a class="link" herf="#">This is link1</a>This is link1<a class="link" herf="# link2">This is link2</a>This is link2

(2)找出含有特定CSS属性的元素

使用select找出所有id为title的元素 (id前面需要加#)使用select找出所有class为link的元素 (class前面需要加.)使用select找出a tag的href的连结

from bs4 import BeautifulSoup##读入BeautifulSouphtml_sample = '\<html> \<body> \<h1 id="title">hello world</h1> \<a href="#" class="link">This is link1</a> \<a href="# link2" class="link">This is link2</a> \</body> \</html> 'soup = BeautifulSoup(html_sample,'html.parser')#使用select找出所有id为title的元素 (id前面需要加#)tit = soup.select("#title")print(tit[0])#使用select找出所有class为link的元素 (class前面需要加.)#使用select找出a tag的href的连结for link in soup.select(".link"):print(link)print(link['href'])

运行结果是:

<h1 id="title">hello world</h1><a class="link" href="#">This is link1</a>#<a class="link" href="# link2">This is link2</a># link2

对于里面含有很多属性的连结,我们可以用类似字典的方式,一一挑选出它的值

x = '<y href="#" qoo=123 abc="u6">I am a link</y>'soup1 = BeautifulSoup(x,'html.parser')print(soup1.select('y')[0]['href'])print(soup1.select('y')[0]['qoo'])print(soup1.select('y')[0]['abc'])

结果是:

#123u6

4 开始爬取新浪新闻工作

我们要获取的内容是最新新闻的标题,时间,网站链接等信息,但是用之前的requests.get请求获取新浪的国内新闻,发现得到的响应里并没有我们要的class = 'feed-card-item'这一项。今天下午搞了一下午,对于没有任何前端基础的我,简直就是碰壁碰壁再碰壁~,

后经思考发现,这一项是动态的JS页面,不能通过requests.get来获得,所以我们使用selenium,启动浏览器,获取动态信息。

代码如下:

import requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverdriver = webdriver.Chrome()driver.maximize_window()driver.get("/china/")data = driver.page_sourcesoup = BeautifulSoup(data, 'lxml')for new in soup.select('.feed-card-item'):if len(new.select('h2'))>0:print(new.select('a')[0]['href'])print(new.select('h2')[0].text)

运行结果:

/c/-11-23/doc-ihpevhck3439569.shtmlD&G辱华事件 中国普通民众的意见(部分)来了/c/-11-23/doc-ihpevhck3431392.shtml不出所料 帮D&G“解套”的来了/c/-11-23/doc-ihpevhck3411471.shtml实拍D&G北京门店:店内无顾客 店外有人"拍照留念"/c/-11-23/doc-ihmutuec2997810.shtml王伟履新中华全国供销总社 曾在中纪委工作/c/-11-23/doc-ihmutuec2997470.shtml于丹卸任北师大艺术与传媒学院分党委书记/c/-11-23/doc-ihpevhck3355376.shtml社科院企业社会责任排名 三星领跑外企首位/c/-11-23/doc-ihmutuec2997963.shtml中方提出世贸组织改革的三个基本原则和五点主张/c/-11-23/doc-ihmutuec2997033.shtml国家监委和重庆公安局一起查的老虎 多涉一宗罪/o/-11-23/doc-ihpevhck3356471.shtml流失海外的敦煌写经“回乡” 首次现身深圳(图)/c/-11-23/doc-ihmutuec2994183.shtml刘源披露:这件事 刘少奇在中共中央总负责/c/-11-23/doc-ihmutuec2994814.shtml她成全国最年轻女性省部级领导 系清华博士(简历)/c/-11-23/doc-ihpevhck3323336.shtml外媒:中国驻巴基斯坦领馆遇袭 2名签证申请者身亡/c/-11-23/doc-ihpevhck3322989.shtml北京任命两位副市长 市政府班子再现“一正九副”/c/-11-23/doc-ihpevhck3341319.shtml长江证券正副董事长双双请辞:尤习贵因年龄原因/c/-11-23/doc-ihpevhck3314641.shtml北京集中任命12个政府组成部门负责人/c/-11-23/doc-ihmutuec2990016.shtml林克庆和张家明任北京市副市长(图/简历)/o/-11-23/doc-ihpevhck3325822.shtml这些试图挑战国人底线的人和企业 下场都是这样的/c/-11-23/doc-ihpevhck3299710.shtml郭宁宁任福建省副省长(图/简历)/c/-11-23/doc-ihmutuec2984941.shtml杜嘉班纳道歉声明只在中国发 海外官方账号无动静/c/-11-23/doc-ihpevhck3270092.shtml刘强东案披露"床单精液" 检方:富翁身份无关本案

这个只是获取了标题和网址。至于文章内容和时间,以及编者和评论数

待续~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。