最近,在數據挖掘課,要交課設了,打算做一個通過機器學習進行新聞分類,首先要有大量的文本(新聞),去做訓練,並通過爬蟲爬取大量的新聞
一,思路如下:
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 裡面有許多有意思的項目值得去學習,研究