抓取网页新闻(公众号的第一篇文章,就先来介绍介绍(组图))

优采云 发布时间: 2021-12-27 22:15

  抓取网页新闻(公众号的第一篇文章,就先来介绍介绍(组图))

  在公众号的第一篇文章中,介绍一下我做过的最简单的新闻爬虫。这个爬虫本身是java写的,在我之前项目的服务器上搭载。今天我将在python中实现它。这个爬虫我已经多次跟别人说过了,在双星的舞台上,在新生的导航课上(两次),在课堂上。其实现在回过头来看这个爬虫真的很low很简单,但是好歹也是花了很长时间才学会的,所以今天就用python系统地实现一下吧。

  欢迎关注公众号:老白和他的爬虫

  新闻爬虫1.单个网页信息爬取1.1获取目标网址信息

  import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/info/1009/7267.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

print(req.text)

  我选择的网站是华世征信官网。在这段代码中,我们通过 requests.get() 获取目标对象。这一步可以理解为用浏览器打开一个网页。记得通过req.encoding统一编码格式,避免乱码。最后一行是输出这个网页的源代码

  1.2. 提取目标 URL 信息

  我们使用浏览器打开特定的网页来查看我们需要的信息

  谷歌浏览器可以直接查看我们需要的信息在哪里

  

  网址

  可以看到我们需要的文本信息在class="sub_r_con sub_r_intro"的div中。到这里,我们就得搞清楚我们需要的信息是什么(其实这一步一定要在你写爬虫之前确定)。这里我们需要的是新闻标题、日期、作者、正文,下面我们一一分解

  1.2.1获取称号

  同样,我们检查标题在哪里

  

  标题

  我们发现这个标题在中间,下面通过代码获取

  from bs4 import BeautifulSoup

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/info/1009/7267.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

title = bf.find_all('h1') #获取页面所有的h1标签

print(title)

  逐行阅读代码其实很容易理解。之前我们拿到了网页的源代码。通过bf = BeautifulSoup(html,'lxml')对网页进行解析,对解析出的网页结构赋予bf

  . 这里要说明一下,lxml是一个参数,后面会在专门学习BeautifulSoup的部分学习。

  我们将所有模块分配给标题。这一步是通过 bf.find_all() 实现的。这也很好理解。解析出来的网页子模块赋值给bf,我们通过操作bf.find_all()找到它的标签,赋值给title

  但是当我们输出这段代码时,问题就来了

  

  结果

  这是因为整个页面有多个标签,只有第三个标签符合我们的要求。您只需要修改代码即可达到最终想要的效果。

  from bs4 import BeautifulSoup

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/info/1009/7267.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

titles = bf.find_all('h1') #获取页面所有的h1标签

title = titles[2].text#提取最后一个节点转换为文本

print(title)

  1.2.2获取日期和作者

  同样,我们找到日期和作者所在的div标签,发现它的类别是class_="cz",提取出来。

  from bs4 import BeautifulSoup

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/info/1009/7267.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

author_date = bf.find_all('div',class_="cz") #获取页面的作者和日期

print(author_date[0].text)

  这里再补充一点,即使模块中只有一个标签,元素也必须以列表的形式表示,就像这里的author_date一样,否则会报错

  1.2.3获取文本

  相信如果你之前什么都做到了,这一步你就会很熟练了。首先找到文本所在的div为class="normal_intro",修改之前的代码

  from bs4 import BeautifulSoup

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/info/1009/7267.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

article = bf.find_all('div',class_="normal_intro") #获取页面正文

print(article[0].text)

  2.多网页链接抓取

  以上只是针对某个新闻页面的信息抓取,我们需要做的是,给定华世征信网站,可以自动抓取上述所有网址

  2.1获取翻页链接

  首先,我们有一个问题。我们在浏览新闻网站时,需要翻页,我们的爬虫也需要获取目标网页的翻页地址。

  

  翻页

  这里需要两个步骤:

  查看源码,发现翻页标签链接收录

xydt/

  

  网页网址

  这个很简单,我们可以通过下面的代码得到翻页的链接

  from bs4 import BeautifulSoup

import re

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/xwdt/xydt.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

fan_linklist = [] #存入翻页地址

for x in bf.find_all('a',href = re.compile('xydt/')): #找到目标a标签

link = x.get('href') #提取链接

if link:

fan_linklist.append(link) #存入列表

print(fan_linklist)

  2.2获取新闻链接地址

  通过上面的代码,你只需要找到新闻链接标签的特征,修改代码即可。仔细检查可以发现所有新闻链接都收录

info/

  from bs4 import BeautifulSoup

import re

import requests

if __name__ == "__main__":

target = 'http://imd.ccnu.edu.cn/xwdt/xydt.htm' #目标网址

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

xinwen_linklist = [] #存入翻页地址

for x in bf.find_all('a',href = re.compile('info/')): #找到目标a标签

link = x.get('href') #提取链接

if link:

xinwen_linklist.append(link) #存入列表

print(xinwen_linklist)

  3.集成代码

  好的,如果你能做到这一步,你已经明白原理了,嗯……你没听错,但是你明白原理。编写程序最麻烦的部分是调试和修改,所以后面的工作你会做。金额可能是您面前金额的数倍

  我们再重新梳理一下这个爬虫的逻辑

  获取当前地址的翻页地址,即下一页地址。重复此步骤,直到获取到网站的所有翻页地址。获取每个地址中的新闻链接。新闻信息被提取。

  还有一点需要注意的是,在第一步和第二步中,我们要设置一个重复数据删除程序,即去除重复爬取的地址,这样才能保证效率,保护电脑。这对你有好处。

  让我们现在就开始做吧!

  另外,我需要说明一下,上面的代码片段侧重于原理。最终的爬虫代码可能与上面的代码略有不同,但实际上,它们始终是密不可分的。

  from bs4 import BeautifulSoup

import re

import requests

class downloader(object):

def __init__(self):

self.target = 'http://imd.ccnu.edu.cn/xwdt/xydt.htm' #目标网址

"""

函数说明:获取翻页地址

Parameters:

xiayiye - 下一页地址(string)

Returns:

fanye - 当前页面的翻页地址(list)

"""

def get_fanye_url(self,target):

req = requests.get(target) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

fanye = []

for x in bf.find_all('a',class_="Next"): #找到目标a标签

link = x.get('href') #提取链接

if link:

link = link.replace('xydt/','')

link = "http://imd.ccnu.edu.cn/xwdt/xydt/" + link #将提取出来的链接补充完整

fanye.append(link) #存入列表

return fanye

"""

函数说明:获取新闻地址

Parameters:

fanye - 翻页地址(string)

Returns:

xinwen_linklist - 新闻链接(list)

"""

def get_xinwen_url(self, fanye):

req = requests.get(fanye) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

xinwen_linklist = [] #存入翻页地址

for x in bf.find_all('a',href = re.compile('info/')): #找到目标a标签

link = x.get('href') #提取链接

if link:

link = "http://imd.ccnu.edu.cn" + link.replace('../..','') #将提取出来的链接补充完整

xinwen_linklist.append(link) #存入列表

return xinwen_linklist

"""

函数说明:获取新闻信息

Parameters:

xinwen_url - 新闻链接(string)

Returns:

xinwen - 新闻信息(list)

"""

def get_xinwen(self, xinwen_url):

req = requests.get(xinwen_url) #获取对象

req.encoding = "utf-8" #设置编码格式

html = req.text #获得网页源代码

bf = BeautifulSoup(html,'lxml') #利用BeautifulSoup进行解析

titles = bf.find_all('h1') #获取页面所有的h1标签

title = titles[2].text#提取最后一个节点转换为文本

print("标题:"+title)

author_date = bf.find_all('div',class_="cz")[0].text #获取页面的作者和日期

print("作者和日期:"+author_date)

article = bf.find_all('div',class_="normal_intro")[0].text #获取页面正文

print("正文:"+article)

xinwen = ["标题:"+title,"作者和日期:"+author_date,"正文:"+article]

return xinwen

if __name__ == "__main__":

dl = downloader()

fanye = dl.get_fanye_url(dl.target)

'''

获取全部的翻页链接

'''

for x in fanye:

b = dl.get_fanye_url(x)

for w in b: #这一个循环的目的是获取翻页链接的同时去重

if w not in fanye:

fanye.append(w)

print("翻页链接"+w)

'''

获取每一个翻页链接里的新闻链接

'''

xinwen_url = []

for x in fanye:

a = dl.get_xinwen_url(x)

for w in a: #这一个循环的目的是获取新闻链接的同时去重

if w not in xinwen_url:

xinwen_url.append(w)

print("新闻地址"+w)

'''

获取每一个新闻链接的新闻信息

'''

xinwen = []

for x in xinwen_url:

xinwen.append(dl.get_xinwen(x))

  好了,爬虫就写到这里了,复制我的代码在编辑器中运行,就可以爬取华世征信官网的所有新闻,复制这段代码可能只需要几秒钟,但是如果你能看懂每一步的逻辑,相信你能很快学会一个简单的爬虫。(运行时间约20分钟,数据量1200)

  另外,我还想投诉。文章开头我说我觉得这个爬虫非常低级和简单,但是我实际操作它花了两天时间。当然,这两天并不是所有人都在写程序。实习的时候写的。似乎一切都不容易。让我们一步一步来。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线