20204314 2020-2021 《Python程式設計》實驗四報告
20204314 2020-2021《Python程式設計》實驗四報告
課程:《Python程式設計》
班級: 2043
姓名: 鍾浩然
學號:20204314
實驗教師:王志強
實驗日期:2021年6月24日
必修/選修: 公選課
一、實驗內容
- Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
(1)程式能執行,功能豐富。(需求提交原始碼,並建議錄製程式執行的視訊)10分
(2)綜合實踐報告,要體現實驗分析、設計、實現過程、結果等資訊,格式規範,邏輯清晰,結構合理。10分。
(3)在實踐報告中,需要對全課進行總結,並寫課程感想體會、意見和建議等。5分
二、實驗過程
1.網路爬蟲實戰
抓取豆瓣電影Top250電影資訊。
url:https://movie.douban.com/top250
程式碼
# 引入庫
import re
import pandas as pd
import time
import urllib.request
from lxml.html import fromstring
from bs4 import BeautifulSoup
# 下載連結
def download(url):
print('Downloading:', url)
request = urllib.request.Request(url)
request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36') #進行偽裝
resp = urllib.request.urlopen(request)
html = resp.read().decode('utf-8')
return html
# 待爬取內容
name = []
year = []
rate = []
director = []
scriptwriter = []
protagonist = []
genre = []
country = []
language = []
length = []
# 迴圈爬取每頁內容
for k in range(10):
url = download('https://movie.douban.com/top250?start={}&filter='.format(k*25))
time.sleep(5) #間隔5s,防止被封禁
#找出該頁所有電影連結
Links = re.findall('https://movie\.douban\.com/subject/[0-9]+/', url)
movie_list = sorted(set(Links),key=Links.index)
for movie in movie_list:
url = download(movie)
time.sleep(5)
tree = fromstring(url)
soup = BeautifulSoup(url)
#利用正則表示式定位爬取
name.append(re.search('(?<=(<span property="v:itemreviewed">)).*(?=(</span>))',url).group())
year.append(re.search('(?<=(<span class="year">\()).*(?=(\)</span>))', url).group())
rate.append(re.search('(?<=(<strong class="ll rating_num" property="v:average">)).*(?=(</strong>))', url).group())
#利用xpath定位爬取
director.append(tree.xpath('//*[@id="info"]/span[1]')[0].text_content())
scriptwriter.append(tree.xpath('//*[@id="info"]/span[2]')[0].text_content())
protagonist.append(tree.xpath('//*[@id="info"]/span[3]')[0].text_content())
#利用find_all爬取
genres = soup.find_all('span',{'property':'v:genre'})
#將型別用'/'拼接
temp = []
for each in genres:
temp.append(each.get_text())
genre.append('/'.join(temp))
#利用find定位爬取
country.append(soup.find(text='製片國家/地區:').parent.next_sibling) #兄弟節點
language.append(soup.find(text='語言:').parent.next_sibling)
length.append(soup.find('span',{'property':'v:runtime'}).get_text())
# 將list轉化為dataframe
name_pd = pd.DataFrame(name)
year_pd = pd.DataFrame(year)
rate_pd = pd.DataFrame(rate)
director_pd = pd.DataFrame(director)
scriptwriter_pd = pd.DataFrame(scriptwriter)
protagonist_pd = pd.DataFrame(protagonist)
genre_pd = pd.DataFrame(genre)
country_pd = pd.DataFrame(country)
language_pd = pd.DataFrame(language)
length_pd = pd.DataFrame(length)
# 拼接
movie_data = pd.concat([name_pd,year_pd,rate_pd,director_pd,scriptwriter_pd,protagonist_pd,genre_pd,country_pd,language_pd,length_pd],axis=1)
movie_data.columns=['電影','年份','評分','導演','編劇','主演','型別','國家/地區','語言','時長']
#保留電影中文名
f = lambda x: re.split(' ',x)[0]
movie_data['電影'] = movie_data['電影'].apply(f)
#刪去冗餘部分
g = lambda x: x[4:-1] + x[-1]
movie_data['導演'] = movie_data['導演'].apply(g)
movie_data['編劇'] = movie_data['編劇'].apply(g)
movie_data['主演'] = movie_data['主演'].apply(g)
movie_data.head()
# 輸出
outputpath='c:/Users/zxw/Desktop/
movie_data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')
爬蟲結果
2.實驗過程中遇到的問題及解決過程
- 問題1:對爬蟲技術不熟悉導致無從下手
問題1解決方案:自己在網路上檢視相關知識
3. 其他(感悟、思考等)
1.上課沒認真聽,沒跟上,下課要花時間學習,但爬蟲還是很厲害。