网页新闻抓取(Python开发简单爬虫,开始​要爬取的澎湃新闻网页url )

优采云 发布时间: 2021-10-13 08:28

  网页新闻抓取(Python开发简单爬虫,开始​要爬取的澎湃新闻网页url

)

  前言

  因为学校的大数据课程需要获取数据,我们设置了爬虫实验。之前没怎么接触过爬虫,所以在网上找了个视频。这里推荐牧奇网的爬虫视频:Python开发一个简单的爬虫。短小精悍,实用。

  开始

  需要爬取的澎湃新闻网页的url为:按照基本爬虫写,需要:

  

  图片

  这里的写法比较简单,只选择了一条评论超过1k的新闻进行爬取。使用的主要库是 urllib.request(网络下载器)和 beautifulsoup(网络解析器)。因为澎湃新闻评论是通过下拉浏览器侧边栏自动刷新的,使用了自动工具,最后将数据写入txt文件,使用了python写文件的一些知识,所以这个主要流程爬虫是:

  (刚开始爬,发现一条评论无法爬取……自闭……打开网页仔细查看后,发现评论信息被下拉刷新了。不知有没有是任何可以模拟网页自动下拉刷新的工具。我在网上搜索了资料,发现selenium是一个可以用ChromeDriver控制谷歌浏览器的自动化工具。)

  还有一个坑。之前用beautifulsoup的时候,不知道可以递归调用find()和find_all()函数。我为如何找到子标签的问题苦苦挣扎了很长时间。这样看来,beautifulsoup还是蛮好用的。

  我们来谈谈解析数据的问题。要分析网页的数据,您需要了解网页的内容。您只需要在要查看的网页内容上右击,查看元素,就可以看到该网页的内容(例如在这里查看昵称的网页结构):

  

  图片

  

  图片

  结尾有坑。写入文件时,最好将字符集指定为utf-8,否则会出现乱码。

  完整代码如下:

  #-*-coding:utf-8-*-

# 解析html的

from bs4 import BeautifulSoup

# 模仿浏览器的

from selenium import webdriver

# 模仿键盘,操作下拉框的

from selenium.webdriver.common.keys import Keys

# 网页解析器BeautifulSoup

from bs4 import BeautifulSoup

import urllib.request

# 正则表达式

import re

# 找到的一则评论大于1k的有关校园暴力的url

# https://www.thepaper.cn/newsDetail_forward_3564808

url = "https://www.thepaper.cn/newsDetail_forward_3564808"

# 打开文件(指定编码,否则会出现乱码的情况)

with open('./my_data','wt',encoding='utf-8') as f:

# 爬取评论节点(评论如果不下拉刷新的话爬取不到,页面是下拉刷新的,需要使用自动化工具)

# 打开浏览器

driver = webdriver.Chrome(executable_path="D:\\chromedriver.exe")

# 打开你的访问地址

driver.get(url)

# 将页面最大化

driver.maximize_window()

# 循环下拉

# js="var q=document.documentElement.scrollTop=10000"为js脚本,页面下拉

js="var q=document.documentElement.scrollTop=250000"

for i in range(10000):

driver.execute_script(js)

driver.implicitly_wait(3)

# 创建beautifulsoup对象

html = BeautifulSoup(driver.page_source)

# 新闻标题:太原师范学院回应“女生自述遭室友的校园暴力”:正认真核查

title = html.find('h1',class_="news_title").get_text()

print("标题: {}".format(title), file=f)

# 新闻链接就是url

print("链接: {}".format(url), file=f)

# 获取评论数

comment_num_block = html.find('h2',id="comm_span")

comment = re.search(r'\d+[k]*', comment_num_block.get_text()).group()

print("评论数: {}".format(comment), file=f)

# 获取新闻发表时间

publish_time_block = html.find('div',class_="news_about")

# 匹配日期正则表达式

time = re.search(r'\d{4}-\d{1,2}-\d{1,2}', publish_time_block.get_text()).group()

print("时间: {}".format(time), file=f)

print("", file=f)

# 爬取评论节点

# 评论的节点为

comment_nodes = html.find_all('div', class_="comment_que")

count = 1

# print("开始打印评论:")

for node in comment_nodes:

# 获取昵称

nickname = node.find('div', class_="aqwright").find('h3').find('a').get_text().strip()

print("Nickname:{}".format(nickname), file=f)

# 获取评论主体内容

content = node.find('div', class_="aqwright").find('div', class_="ansright_cont").get_text().strip()

print("Content:{}".format(content), file=f)

count = count + 1

if (count < 1000):

# 在每一条评论间打印空行

print("",file=f)

print(count)

else:

break

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线