python新闻爬虫教程_python简易爬虫教程--(一)批量获取搜狐新闻
我們先從簡單的抓取文本信息開始,來寫我們的第一個爬蟲程序,獲取搜狐新聞的內容。
我們首先來介紹一下我們需要用到的庫。
爬蟲程序的步驟,一般可以分為三步:
1.獲取網頁源碼(html源碼);
2.從代碼中搜索自己需要的資源的位置;
3.獲取(下載)該資源。
當然,現在有很成熟的python爬蟲庫比如scrapy等直接帶有這些模塊,讓你用非常少的代碼寫出自己的爬蟲程序。但是,本教程還是希望教會大家最基本的原理,帶領大家自己搭建爬蟲框架,這樣對于深入理解和后續學習是非常有好處的。同時,這樣對python語言基礎的要求也不會很深。
好啦,少啰嗦,在上述步驟中,我們需要用到的python的庫分別是:
1.獲取網頁源碼(html源碼):requests
2.從代碼中搜索自己需要的資源的位置: BeautifulSoup, re(正則表達式)
3.獲取(下載)該資源: urlretrieve (from urllib.request) (這個是python自帶的,用于下載網絡文件,但今天爬取新聞的時候我們不會用到)
對于新手來說,安裝各種庫有時會出現各種bug,因此推薦大家使用ide來進行程序的編寫。我們可以使用免費的pycharm 社區版本。 https://www.jetbrains.com/pycharm/
長這樣:
直接在設置里面可以選擇python解釋器并添加我們需要的庫:
接下來,導入我們需要用到的這些庫:
import requests #用于獲取網頁
from bs4 import BeautifulSoup #用于分析網頁
import re #用于在網頁中搜索我們需要的關鍵字
好了,我們要開始按照步驟來編寫爬蟲了。
1.獲取網頁源代碼
在chrome瀏覽器打開搜狐新聞的網頁,單擊右鍵,選中檢查選項,進入檢查界面
然后選中network標簽,點擊刷新按鈕重新載入頁面,注意network中的第一項,即是這個頁面的獲取方法。如圖,顯示這個頁面是從GET這個方法得到的。
image.png
因此,我們在程序中使用requests庫的get方法,獲取網頁元代碼:
baseurl='http://news.sohu.com/'
html=requests.get(baseurl) #這是使用requests庫的get方法,獲取網頁元代碼
print(html.text) #我們打印出來看看對不對
#注意這里由于html是一個容器,他的內容放在text這個屬性里面,因此要寫html.text來取出里面的文字
運行一下:
我們已經成功獲取了網頁的源代碼,第一步完成。
2.從代碼中搜索自己需要的資源的位置
我們希望獲取這個網頁上的新聞的標題,來源,時間和鏈接這四個信息,因此,我們需要對網頁進行解析。使用BeautifulSoup這個庫。
soup=BeautifulSoup(html.text,'html.parser') #將html.text裝進一個soup容器中
#此處html.parser為python自帶的一個html解析器,用lxml也可以,不過要自己安裝
然后,我們來發現一下我們需要獲取的這些信息的特征。在chrome的檢查頁面,我們隨便右擊一個新聞標題,選擇檢查。然后我們發現自動跳到這一段高亮源代碼,這就是這個新聞在網頁源碼中的位置。
再換一個新聞試一下,
image.png
我們發現在這些代碼的上級都有一個
那么,這個class應該代表的就是每一個新聞的類別了。我們只要把class=list16這個類別找出來,就能找出這個頁面中所有的新聞了。我們使用BeautifulSoup的find_all功能。
newslist=soup.find_all(class_='list16') #注意find_all返回的是一個列表
print(newslist) #打印出來看一下
果然,這個列表中的每一項,都包含一個title,是新聞的標題,一個href,是新聞的鏈接。
因此我們將這兩個信息提取出來。
for news in newslist: #寫一個循環
news_title=news.li.a['title'] #這是BeautifulSoup的功能,‘.’屬性返回當前標簽的第一個子標簽。
#因為上面我們發現 news=
#因此我們要進入news的li標簽底下的a標簽
news_link=news.li.a['href'] #a標簽中包含一個字典,用['href']取出href對應的值
print(news_title,news_link) #打印出來
很好,我們提取到了新聞標題和它對應的鏈接,但是我們發現有一個報錯,他說,在這個報錯中,news.li.a不存在。因此我們使用try語句來應對這個報錯,將上面的代碼修改為:
for news in newslist:
try:
news_title=news.li.a['title']
news_link=news.li.a['href']
except:
print('無法處理')
else:
print(news_title,news_link)
好了,這次報錯的信息顯示無法處理了,程序沒有被中斷。
我們現在已經獲得了新聞的標題和鏈接。但是,注意有一些鏈接是完整的,有一些鏈接,如
if re.match(r'http:',news.li.a['href']):
#re.match 用于判news.li.a['href']是否含有‘http:’字符串,如果沒有,加上
news_link = news.li.a['href']
else:
print('加上')
news_link = 'http:' + news.li.a['href']
現在鏈接都正常了。
現在我們想獲得它的時間和來源。我們需要點到這個新聞的頁面去。
image.png
同樣的,我們發現了時間對應的代碼(class=time)。同理可以獲得作者對應的代碼(tag:
)。
但是,別忘了,這是一個新的網頁,因此我們要重新獲取網頁源代碼,并進行解析。因此在for循環內部續寫:
for news in newslist:
try:
news_title=news.li.a['title']
if re.match(r'http:',news.li.a['href']):
news_link = news.li.a['href']
else:
news_link = 'http:' + news.li.a['href']
except:
print('無法處理')
else:
# 在此循環內部續寫
newshtml=requests.get(news_link)
newssoup=BeautifulSoup(newshtml.text,'html.parser')
news_time=newssoup.find_all(class_='time')[0].text
#前面提到,find_all返回一個列表,所以[0]取出列表中第一個元素,然后我們取出標簽的內容屬性'.text'。
news_author=newssoup.find_all('h4')[0].text
print(news_title, news_time, news_author, news_link)
運行一下:
有的正常,有的報錯,同樣,用try解決一下。把代碼更改為:
# 在此循環內部續寫
newshtml=requests.get(news_link)
newssoup=BeautifulSoup(newshtml.text,'html.parser')
try:
news_time=newssoup.find_all(class_='time')[0].text
news_author=newssoup.find_all('h4')[0].text
except:
print('無法處理')
else:
print(news_title, news_time, news_author, news_link)
好了,這下好了。第二部,解析并獲取我們需要的信息,完成。
3.存儲信息
我們希望將這下抓取到的信息保存下來,而不是直接print在terminal里面。
所以,我們定義一個寫入文件的函數。注意,這段代碼要放在主程序代碼之前,不然我們調用函數的時候程序會找不到它在哪。
def writefile(news_title,news_author,news_time,news_link):
#我們要傳入四個數據,分別就是新聞的標題,作者,時間,鏈接
file = open('newstoday.txt', 'a') #打開文件‘newstoday.txt’,以‘a’續寫的方式寫入
file.write(news_title+'\t'+news_author+'\t'+news_time+'\t'+news_link+'\n')
#寫入數據,‘\t’為tab,'\n'為換行符
file.close() #打開文件后一定記住關閉,不然程序會一直卡在這里不走
然后,我們在for循環里,每抓取到一個新聞的信息就調用這個函數寫文件:
writefile(news_title,news_author,news_time,news_link)
好了,代碼已經寫完了。完整代碼長這樣:
import requests # 用于獲取網頁
from bs4 import BeautifulSoup # 用于分析網頁
import re # 用于在網頁中搜索我們需要的關鍵字
#寫入文件
def writefile(news_title,news_author,news_time,news_link):
file = open('newstoday.txt', 'a')
file.write(news_title+'\t'+news_author+'\t'+news_time+'\t'+news_link+'\n')
file.close()
#獲取網頁
baseurl = 'http://news.sohu.com/'
html = requests.get(baseurl)
print(html.text)
#解析網頁
soup=BeautifulSoup(html.text,'html.parser')
newslist=soup.find_all(class_='list16')
print(newslist)
for news in newslist:
try:
news_title=news.li.a['title']
if re.match(r'http:',news.li.a['href']):
news_link = news.li.a['href']
else:
news_link = 'http:' + news.li.a['href']
except:
print('無法處理')
else:
# 在此循環內部續寫
newshtml=requests.get(news_link)
newssoup=BeautifulSoup(newshtml.text,'html.parser')
try:
news_time=newssoup.find_all(class_='time')[0].text
news_author=newssoup.find_all('h4')[0].text
except:
print('無法處理')
else:
print(news_title, news_time, news_author, news_link)
writefile(news_title,news_author,news_time,news_link)
print('抓取完畢')
運行一下,抓取完畢。
然后我們打開我們這個腳本所在的目錄,發現newstoday.txt 已經生成了。
打開看看,我們抓取到的信息全都寫進去了。
到這里,第三步完成。我們這個爬蟲程序算是完成了。
好啦。感謝大家的閱讀。如果你喜歡我的爬蟲教程,可以關注我的賬號,后續還會有更多的更新。如果有什么建議,也歡迎在評論區留言,我會悉心聽取。
聲明:本教程及代碼僅作教學之用,無意侵犯其它網站或公司版權。本節爬取的搜狐新聞內容,版權為搜狐新聞網站所有。對于套用本教程代碼非法爬取其他網站或公司非公開數據而導致的損害,本教程不承擔任何責任。
總結
以上是生活随笔為你收集整理的python新闻爬虫教程_python简易爬虫教程--(一)批量获取搜狐新闻的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动点击器苹果版
- 下一篇: python3反爬虫原理与绕过实战 网盘