最近學習了 html5 相關的網頁标簽的基礎知識,這個對beautiful soup的應用了解有很多的幫助,于是重新整理了之前的代碼。
有興趣的可以參考。
import os
import requests
from bs4 import BeautifulSoup
file_path = 'D:\python3.6\scrapy\maoyan'
# 定義檔案夾,友善後續check檔案夾是否存在
file_name = 'maoyan.txt'
# 自定義檔案名稱
file = file_path+'\\'+file_name
# 建立檔案全位址,友善後續引用
url = "http://maoyan.com/board/4"
# 擷取url的開始頁
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
if os.path.exists(file):
# 如果檔案存在,就在程式運作開始頭指針開始編輯,即清空原有内容;
# 如果檔案不存在,就建立一個新檔案
with open(file, 'w', encoding='utf-8') as f:
# 打開目标檔案夾中的檔案
f.truncate()
#清空檔案内容,注意:僅當以 "r+" "rb+" "w" "wb" "wb+"等以可寫模式打開的檔案才可以執行該功能
def get_all_pages(start):
# 自定義擷取所有目标pages頁的内容的函數
pages=[]
#定義空清單,加載擷取的page内容
for n in range(0,100,10):
# 确認offset的步進值,注意把int的n轉換為str
# 周遊所有的url,并擷取每一頁page的目标内容
if n==0:
url=start
else:
url=start+'?offset='+str(n)
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
page= soup.find_all(name='dd')
# 将取該gage的所有dd節點的内容轉換為soup屬性
pages.extend(page)
# 利用extend方法擴充pages list内容
return pages
# 傳回所有pages list内容
text = get_all_pages(url)
for film in text:
# 周遊清單 text中的所有元素,也就是每個dd節點内容
# 這個for循環應該優化成 自定義函數形式;
dict ={}
# 建立空dict,用來存放film資訊
dict['Index']=film.i.string
# 選取第1個i節點标簽的的string值,即film的排行值,并存入字典dict中
dict['name']=film.a.attrs['title']
# 選取第1個a節點标簽的title屬性的名稱,即film的名稱,并存入字典dict中
dict['star']=film.find(name='p',attrs={'class': 'star'}).string.strip()
# 選取第1個節點标簽名稱為p,且class屬性名稱為star的string值,并利用strip方法去除文本的前後的空格或者換行,并存入字典dict中
time=film.find(name='p',attrs={'class': 'releasetime'}).string.strip()
dict['releasetime']=time[5:15]
# 選取第1個節點标簽名稱為p,且class屬性名稱為releasetime的string值,
# 并利用strip方法去除文本的前後的空格或者換行,并存入字典dict中
sco1=film.find(name='i',attrs={'class': 'integer'}).string
sco2=film.find(name='i',attrs={'class': 'fraction'}).string
# 選取第1個節點标簽名稱為i,且class屬性名稱為integer或者fraction的string值
dict['score']=sco1+sco2
# 存入score值
print(dict)
# 檢查dict是否為目标輸出内容
with open(file, 'a+', encoding='utf-8') as f:
# 以 a+ 方式打開目标file檔案,
# 如果該檔案已存在,檔案指針将會放在檔案的結尾。
# 檔案打開時會是追加模式。如果該檔案不存在,建立新檔案用于讀寫。
f.write(str(dict)+'\n')
# 注意添加 換行符 '\n',實作每個dict自動換行寫入txt中
print('抓取完畢')
貓眼電影TOP100榜單中的抓取目标dd節點内容樣式參考:
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img src="http://p1.meituan.net/movie/[email protected]_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">
主演:張國榮,張豐毅,鞏俐
</p>
<p class="releasetime">上映時間:1993-01-01(中國香港)</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">6</i></p>
</div>
</div>
</div>
</dd>