Python对网页信息进行爬取并对标题分词
本篇文章主要對新浪新聞進行python爬蟲爬取。
一.主要使用的python庫
- requests
- bs4
- json
- jieba
二.爬取網頁的信息
爬取的新浪網頁:關于開學,鐘南山說這兩點非常重要!
點擊右鍵檢查,根據網頁的結構可以獲取我們想要的信息。接下來爬取新聞的標題、時間、來源、內容、責任編輯。
接下來獲取評論數,由于新浪新聞中的評論數不再html文件中而在js文件中。我們需要獲取評論的js文件。
復制評論的URL:https://comment.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-irczymi5906268&group=0&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1&uid=unlogin_user&callback=jsonp_1586701508631&_=1586701508631
下載評論數據,去掉元素URL末尾的&callback=jsonp_1586701508631&_=1586701508631
會得到一個json格式的數據
接著解析json數據,評論數是動態變化的。
輸出評論數:
獲取新聞標識符
使用正則表達式獲取新聞標識符:
三.獲取新浪國內最新新聞一個分頁的20條新聞鏈接
新浪國內新聞https://news.sina.com.cn/china/
最下面為分頁的切換。
分頁是動態加載的,通過network找到分頁相關的URL,不同的分頁鏈接有2處不同,如下:
接著我們獲取新浪新聞首頁新聞信息,采用的是api的方式獲取。
新浪首頁的api為:
https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=2&encode=utf-8
獲取新浪新聞第一個分頁的20條鏈接
通過切換分頁,我們可以獲得不同分頁下的新聞信息。
四.jieba分詞簡介
jieba是python中用于分詞的第三方庫。
jieba中文分詞的主要原理:
利用一個中文詞庫,確定中文字符之間的關聯概率,中文字符間概率大的組成詞組,形成分詞結果
jieba庫分詞的三種模式:
| 全模式 | 把文本中所有可能的詞語都掃描出來,有冗余 |
| 搜索引擎模式 | 在精確模式的基礎上,對長詞再次切分 |
jieba庫常用函數:
| jieba.lcut(s) | 精確模式,返回一個列表類型的分詞結果 |
| jieba.lcut(s,cut_all=True) | 全模式,返回一個列表類型的分詞結果,存在冗余 |
| jieba.lcut_for_search(s) | 搜索引擎模式,返回一個列表類型的分詞結果,存在冗余 |
| jieba.add_word(w) | 向分詞詞典增加新詞w |
五.完整代碼
import requests from bs4 import BeautifulSoup import json import re from datetime import datetime import pandas as pd import sqlite3 import os import jieba#新浪首頁api url = 'https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page={}&encode=utf-8' #評論鏈接 commentUrl = 'https://comment.sina.com.cn/page/info?version=1&format=json\ &channel=gn&newsid=comos-{}&group=undefined&compress=0&ie=utf-8&oe=utf-8\ &page=1&page_size=3&t_size=3&h_size=3&thread=1&uid=3537461634'# 爬取網頁內詳細信息 def getNewsDetail(newsurl):result = {}#print('newsurl:',newsurl)res = requests.get(newsurl)res.encoding = 'utf=8'soup = BeautifulSoup(res.text, 'html.parser')result['title'] = soup.select('.main-title')[0].texttimesource = soup.select('.date-source')[0].select('.date')[0].text# dt = datetime.strptime(timesource,'%Y年%m月%d日 %H:%M')result['time'] = timesourceresult['url'] = newsurlresult['origin'] = soup.select('.date-source')[0].textresult['article'] = ' '.join([p.text.strip() for p in soup.select('#article p')[:-1]])result['author'] = soup.select('.show_author')[0].text.lstrip('責任編輯:')result['comments'] = getCommentCounts(newsurl)return result# 爬取評論數量,兩條不同鏈接的評論, #不同的地方是newsid=comos-xxxx部分不一樣,xxx為新聞標識符(newsid),可以用{}來代替,之后用format()函數填充 def getCommentCounts(newsurl):m = re.search('doc-i(.+).shtml', newsurl)newsId = m.group(1)commentURL = commentUrl.format(newsId)comments = requests.get(commentURL)jd = json.loads(comments.text)return jd['result']['count']['total']# 獲取每個分頁的所有新聞的URL,然后取得詳細信息 def parseListLinks(url):newsdetails = []res = requests.get(url)jd = json.loads(res.text)for ent in jd['result']['data']:newsdetails.append(getNewsDetail(ent['url']))return newsdetails news_total = [] # 取得指定分頁的新聞信息 for i in range(1, 2): # 取第一頁的新聞信息newsurl = url.format(i)newsary = parseListLinks(newsurl)#返回的是每個分頁的新聞的信息的列表,列表元素是包含每個新聞具體信息的字典news_total.extend(newsary)#用pandas整理爬取出的資料 df = pd.DataFrame(news_total) # 指定生成的列順序 cols = ['title', 'author', 'time', 'origin', 'article', 'comments', 'url'] df = df.loc[:, cols]# 存儲到sqlite數據庫中 with sqlite3.connect('news.sqlite') as db:df.to_sql('newsInfo', con=db) # 讀取數據庫中的信息 with sqlite3.connect('news.sqlite') as db1:df2 = pd.read_sql_query('SELECT * FROM newsInfo', con=db1) # 保存新聞信息到excel表格中 df2.to_excel('newsDetails2.xlsx')excelFile = r'newsDetails2.xlsx' #讀取excel的數據 data = pd.read_excel(excelFile,sheet_name=0) #獲取標題項并進行分詞 for i in range(20):res=jieba.cut(data['title'][i])print("/".join(res))分詞結果:
六.用詞云對新聞標題可視化
代碼:
from wordcloud import WordCloud import jieba import numpy import PIL.Image as Image import pandas as pdexcelFile = r'C:\Users\Petrichor\Desktop\信息內容安全\爬蟲\demo1\newsDetails2.xlsx' data = pd.read_excel(excelFile,sheet_name=0) with open('word.txt','a') as file:for i in range(20):file.write(data['title'][i])file.write('\n')def chinese_jieba(text):wordlist_jieba=jieba.cut(text)space_wordlist=" ".join(wordlist_jieba)print(space_wordlist)return space_wordlistwith open("word.txt")as file:text=file.read()text=chinese_jieba(text)#2.圖片遮罩層mask_pic=numpy.array(Image.open("img1.png"))#3.將參數mask設值為:mask_picwordcloud = WordCloud(font_path="C:/Windows/Fonts/simfang.ttf",mask=mask_pic,background_color='white').generate(text)image=wordcloud.to_image()image.show()最終結果:
參考博客:
python3編程05–爬蟲實戰:爬取新聞網站信息1
python3編程06–爬蟲實戰:爬取新聞網站信息2
python3編程07-爬蟲實戰:爬取新聞網站信息3
總結
以上是生活随笔為你收集整理的Python对网页信息进行爬取并对标题分词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript作用域解析以及例题
- 下一篇: 【Python】python实现jpg图