最近,在数据挖掘课,要交课设了,打算做一个通过机器学习进行新闻分类,首先要有大量的文本(新闻),去做训练,并通过爬虫爬取大量的新闻
一,思路如下:
0.首先确定获取数据的网站
1.通过BeautifulSoup来切取链接
2. 然后使用python的第三方框架newspaper3k,直接通过给指定的链接,然后返回新闻文本(当然也可通过BeautifulSoup切出文本)
二,过程如下:
1.选定网址 新浪新闻 https://news.sina.com.cn/roll/#pageid=153&lid=2509&k=&num=50&page=1
页面如上
2.查看更多新闻可以使用拼接url 也可以模拟点击,我这里用的模拟点击
使用python 框架 selenium 来进行模拟点击
selenium 是一套完整的web应用程序测试系统,用它来进行模拟点击,需要配合Google Chrome或着火狐浏览器使用,配合不同的驱动
定位点击按钮时,不同的元素
对于新浪网来说如下:
这个点击定位是找到页面中所有对应的id,自上向下,第一个是我们想要的
browser.find_elements_by_class_name("pagebox_pre")[1]
然后每次点击,得到下一页,获取整个界面,切除url,重复
3.利用BeautifulSoup切出新闻的url
def geturl(html): #获取所有新闻链接
sleep(2)
soup = BeautifulSoup(html , "html.parser")
bd = soup.find(attrs = {"class" : "d_list_txt"})
b1 = bd.findAll(attrs = {"class" : "c_tit"})
for u in b1:
urlList.append(u.findAll('a')[0].get("href")) #获取所有新闻链接
4.使用python的第三方框架newspaper3k,直接通过给指定的链接,然后返回新闻文本
def captive( url ): #获取新闻内容
news = Article( url , language='zh')
sleep(1)
news .download() #下载
news .parse() #解析
newsList.append(news.text) #新闻正文
三,具体代码如下
#! /usr/bin/env python
#coding=utf-8
import io
import sys
from tqdm import tqdm
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
from selenium import webdriver
from time import sleep
import requests
from bs4 import BeautifulSoup
from newspaper import Article
from selenium.webdriver.common.action_chains import ActionChains
'''
8 军事 https://news.sina.com.cn/roll/#pageid=153&lid=2514&k=&num=50&page=2
6 娱乐 https://news.sina.com.cn/roll/#pageid=153&lid=2513&k=&num=50&page=2
5 体育 https://news.sina.com.cn/roll/#pageid=153&lid=2512&k=&num=50&page=2
2 科技 https://news.sina.com.cn/roll/#pageid=153&lid=2515&k=&num=50&page=2
1 财经 https://news.sina.com.cn/roll/#pageid=153&lid=2516&k=&num=50&page=2
7 国际 https://news.sina.com.cn/roll/#pageid=153&lid=2968&k=&num=50&page=2
'''
url = "https://news.sina.com.cn/roll/#pageid=153&lid=2515&k=&num=50&page=26"
urlList = [] #url 列表
newsList = [] #newsn内容列表
def captive( url ): #获取新闻内容
news = Article( url , language='zh')
sleep(1)
news .download() #下载
news .parse() #解析
newsList.append(news.text) #新闻正文
def gethtml( url , n ): #新闻的url 及获取的次数1次点击50条
browser.get(url)
for i in range(0,n):
sleep(2)
label_bel = browser.find_elements_by_class_name("pagebox_pre")[1] #定位点击键
html = browser.page_source # 获取网页
geturl(html)
label_bel.click() # 进行点击加载更多
sleep(2)
currentPageUrl = browser.current_url
browser.get(browser.current_url)
def geturl(html): #获取所有新闻链接
sleep(2)
soup = BeautifulSoup(html , "html.parser")
bd = soup.find(attrs = {"class" : "d_list_txt"})
b1 = bd.findAll(attrs = {"class" : "c_tit"})
for u in b1:
urlList.append(u.findAll('a')[0].get("href")) #获取所有新闻链接
browser = webdriver.Chrome() # 加载浏览器
gethtml( url , 20 )
#for url1 in urlList: #测试链接
# print(url1)
print(len(urlList))
for newsurl in tqdm(urlList):
try:
captive( newsurl )
except:
pass
continue
sleep(0.1)
for i in tqdm(range(len(newsList))): #存入文件
try:
f = open(r"datass\2_" + str(1000 + i) + ".txt",'a',encoding="utf-8")
f.write(newsList[i])
f.close()
except:
pass
continue
sleep(0.1)
print("结束")
#print(newsList[0])
#f=open('./1.html',mode="w",encoding="utf-8") #这三行为测试使用
#f.write(html)
四,项目配置
以大部分为python的模块,都可以pip安装,简单介绍:
1 . 预防万一,为了全程的一遍通过,首先更新下pip
python -m pip install --upgrade pip
2. 安装newspaper (强大的获取网页新闻框架)
pip install newspaper3k
3.安装Beautifulsoup
pip install beautifulsoup4
4.安装selenium (selenium 是一套完整的web应用程序测试系统,用它来进行模拟点击,需要配合浏览器使用)
pip install selenium
4.1 与之对应的配置
这里用到的是Google Chrome浏览器
查看浏览器版本号
然后将驱动安装到python的目录
以上全部配置步骤完成
推荐一个网站:https://hellogithub.com 里面有许多有意思的项目值得去学习,研究