抓取网页新闻(爬取网易新闻,实战出真知(-) )
优采云 发布时间: 2022-04-12 09:19抓取网页新闻(爬取网易新闻,实战出真知(-)
)
学习了python的基本语法后,对爬虫产生了浓厚的兴趣。废话不多。今天爬网易新闻,获取真知灼见。
打开网易新闻,可以发现新闻分为以下几个板块:
这次选择国内版块爬文章。
1. 准备
环境:python3
编译器:PyCharm
安装三大浏览器的selenium驱动驱动
下载链接
铬驱动程序:
Firefox 的驱动 geckodriver:
IE的驱动IEdrive:
了解网页
网页色彩鲜艳,漂亮,像一幅水彩画。爬取数据首先需要知道要抓取的数据是如何呈现的,就像学画画一样。在开始之前,你需要知道这幅画是用什么画的,是铅笔还是水彩笔……可能有很多种类型。可以,但是网页信息的呈现方式只有两种:
HTML
JSON
HTML是一种用于描述网页的语言
JSON 是一种轻量级的数据交换格式
爬取网页信息其实就是向网页发出请求,服务器将数据反馈给你
2. 获取动态加载的源代码
导入所需的模块和库:
1 from bs4 importBeautifulSoup2 importtime3 importdef_text_save as dts4 importdef_get_data as dgd5 from selenium importwebdriver6 from mon.keys importKeys7 from mon.action_chains import ActionChains #导入ActionChains鼠标操作类
要获取网页信息,我们需要发送一个请求。请求可以帮助我们很好地做到这一点。不过仔细观察后发现,网易新闻是动态加载的。请求返回实时信息。稍后在网页上加载的数据不会返回。在这种情况下,Selenium 可以帮助我们获取更多数据。我们只是将 selenium 理解为一种自动化测试工具。Selenium 测试直接在浏览器中运行,就像真实用户在操作一样。
我使用的浏览器是火狐
1 browser = webdriver.Firefox() #根据浏览器切换
2 browser.maximize_window()#最大化窗口
3 browser.get('#39;)
这样我们就可以驱动浏览器自动登录网易新闻页面了
我们的目标自然是一次性爬下国内版块,观察网页,只有网页一直向下滑动才会加载新消息。在底部,甚至还需要点击按钮进行刷新:
这时候使用 selenium 就可以显示出它的优势了:自动化,模拟鼠标和键盘操作:
1 diver.execute_script("window.scrollBy(0,5000)")2 #使网页下拉,括号内的值为每次下拉的值
右键点击网页中的Load More按钮,点击View Elements,可以看到
通过这个类,可以定位到按钮。当遇到按钮时,点击事件可以帮助我们自动点击按钮完成页面刷新。
1 #Crawling部分动态加载部分源码
2 3 info1=[]4 info_links=[] #存储文章内容链接
5 try:6 whileTrue :7 if browser.page_source.find("load_more_btn") != -1:8 browser.find_element_by_class_name("load_more_btn").click()9 browser.execute_script("window.scrollBy(0,5000)")10 time.sleep(1)11 except:12 url = browser.page_source#返回满载网页源码
13 browser.close()#关闭浏览器
获取有用的信息
简单来说,BeautifulSoup 是一个 Python 库。它的主要功能是从网页中获取数据,可以减轻菜鸟的负担。通过BeautifulSoup解析网页源代码,并添加附加函数,我们可以很方便的提取出想要的信息,比如:获取文章标题、标签和文本内容超链接
同样右键单击 文章 标题区域以查看元素:
观察网页的结构,发现每个 div 标签 class="news_title" 下都有 文章 标题和超链接。soup.find_all() 函数可以帮助我们找到我们想要的所有信息,并且可以一次性提取出这一层结构下的内容。最后通过字典,将标签信息一一取出。
1 info_total=[]2 defget_data(url):3 汤=BeautifulSoup(url,"html.parser")4 标题=soup.find_all('div','news_title')5 标签=soup.find('div', 'ns_area second2016_main clearfix').find_all('div','keywords')6 for title, label inzip(titles,labels):7 data ={8 '文章title': title.get_text().split (),9 '文章标签':label.get_text().split() ,10 '链接':title.find("a").get('href')11 }12 info_total.append(数据)13 返回 info_total
4. 获取新闻内容
从那时起,新闻链接就被取出并存储在列表中,现在我们需要做的就是使用链接来获取新闻主题内容。新闻主题内容页面是静态加载的,可以轻松处理请求:
1 defget_content(url):2 info_text =[]3 info=[]4 adata=requests.get(url)5 soup=BeautifulSoup(adata.text,'html.parser')6 try:7 文章 = soup.find( "div", 'post_header').find('div', 'post_content_main').find('div', 'post_text').find_all('p')8 除了:9 篇文章 = soup.find("div" , 'post_content post_area clearfix').find('div', 'post_body').find('div', 'post_text').find_all(10 'p')11 for a inarticles:12 a=a.get_text() 13 a= ' '.join(a.split())14 info_text.append(a)15 return (info_text)
之所以使用try except,是因为网易新闻文章在一定时间前后的位置标签不同,不同的情况要区别对待。
最后遍历整个列表,得到所有的文本内容:
1 for i ininfo1 :2 info_links.append(i.get('link'))3 x=0 #控制对文章目录的访问
4 info_content={}#Store文章内容
5 for i ininfo_links:6 try:7 info_content['文章content']=dgd.get_content(i)8 except:9 continue
10 s=str(info1[x]["文章title"]).replace('[','').replace(']','').replace("'",'') .replace(',','').replace('《','').replace('》','').replace('/','').replace(',','') 11 s= ''.join(s.split())12 file = '/home/lsgo18/PycharmProjects/网易新闻'+'/'+s13 print(s)14 dts.text_save(file,info_content['文章内容'],info1[x]['文章标签'])15 x = x + 1
将数据存储到本地txt文件
Python 提供函数 open() 来处理文件。第一个参数为文件路径,第二个为文件处理方式,“w”方式为只写(文件不存在则创建,存在则清除内容)
1 def text_save(filename, data,lable): #filename是写入CSV文件的路径
2 file = open(filename,'w')3 file.write(str(lable).replace('[','').replace(']','')+'\n')4 for i inrange (len(data)):5 s =str(data[i]).replace('[','').replace(']','')#去掉[],这两行根据不同数据,你可以选择
6 s = s.replace("'",'').replace(',','') +'\n' #去掉单引号、逗号,每行末尾追加换行符
7 file.write(s)8 file.close()9 print("保存文件成功")
到此为止,一个简单的爬虫已经写成功了: