Python小爬蟲 抓取豆瓣電影Top250資料

2022-04-12 07:26:08 字數 4445 閱讀 6275

寫leetcode太累了,偶爾練習一下python,寫個小爬蟲玩一玩~比較簡單,抓取豆瓣電影top250資料,並儲存到txt、上傳到資料庫中。

通過分析可以發現,不同頁面之間是有start的值在變化,其他為固定部分。

以物件導向的編碼方式編寫這個程式,養成好的編碼習慣。

基本資訊在 \(__init__\) 函式中初始化。注意到其中有乙個 \(headers\),這是用來做什麼的呢?有一些**有一點點反爬蟲機制,對於一般的爬蟲請求拒絕返回實際資料。一般來說,基本的反爬蟲是通過判斷傳送請求中是否有瀏覽器的基本資訊,因此,我們可以偽裝成瀏覽器傳送這些爬蟲請求,通過修改http包中的heafer實現。

class movietop(object):

def __init__(self):

self.start = 0

self.param = '&filter'

self.headers =

self.movielist =

self.filepath = './doubantop250.txt'

def get_page(self):

try:

url = '' + str(self.start) + '&filter='

myrequest = request.request(url, headers=self.headers)

response = request.urlopen(myrequest)

page = response.read().decode('utf-8')

print('正在獲取第' + str((self.start+25)//25) + '頁資料...')

self.start += 25

return page

except request.urlerror as e:

if hasattr(e, 'reason'):

print('獲取失敗,失敗原因:', e.reason)

在上面的**中,可以得到頁面的**,是hrml格式的文字,我們需要從中提取出有用的資訊。在chrome瀏覽器中,右鍵檢視頁面源**可以看到稍微有格式的html文字,這和我們獲取的page內容是相同的。找到其中的關鍵資料,如下:

從中可以看到一條記錄的頁面**結構,如何從中提取想要的資訊呢?正規表示式匹配!還記得 \(re模組\) 中的 \(compile\)嗎?

這是比較麻煩的一件事,暫時先這樣寫,懂這行的都知道有乙個東西叫做 \(beautiful soup\),它可以簡潔易懂地提取頁面資訊,鑑於練習一下正規表示式,而且也比較簡單,直接寫出整個匹配式。下面是參考**:

還有乙個小問題,本來想提取每條記錄的全部資訊,後來發現有的電影沒有「別名」,還有的電影沒有「主演」,不得不忽略這兩條資訊,最後每條記錄只提取了10個資訊。

def get_page_info(self):

patern = re.compile(u'.*?'

+ u'.*?'

+ u'(.*?).*?'

+ u'.*?'

+ u'(.*?).*?'

+ u'(.*?).*?'

+ u'.*?'

+ u'.*?'

+ u'導演:\s(.*?)\s.*?

' + u'(.*?) / '

+ u'(.*?) / (.*?)

.*?'

+ u'.*?'

+ u''

+ u'(.*?).*?'

+ u'(.*?)人評價.*?'

+ u'(.*?)'

, re.s)

while self.start <= 225:

page = self.get_page()

movies = re.findall(patern, page)

for movie in movies:

movie[1],

movie[2].lstrip(' / '),

movie[3],

movie[4].lstrip(),

movie[5],

movie[6].rstrip(),

movie[7],

movie[8],

movie[9]])

這個就比較簡單了,直接進行檔案操作,將其寫入txt即可。

def write_page(self):

print('開始寫入檔案...')

file = open(self.filepath, 'w', encoding='utf-8')

try:

for movie in self.movielist:

file.write('電影排名:' + movie[0] + '\n')

file.write('電影名稱:' + movie[1] + '\n')

file.write('電影別名:' + movie[2] + '\n')

file.write('導演:' + movie[3] + '\n')

file.write('上映年份:' + movie[4] + '\n')

file.write('製作國家/地區:' + movie[5] + '\n')

file.write('電影類別:' + movie[6] + '\n')

file.write('評分:' + movie[7] + '\n')

file.write('參評人數:' + movie[8] + '\n')

file.write('簡短影評:' + movie[9] + '\n')

file.write('\n')

print('成功寫入檔案...')

except exception as e:

print(e)

finally:

file.close()

作為實驗,先在本地mysql資料庫中建立pythontest資料庫,建立doubantop250表,就不在python**中建立了。注意字符集設為 \(utf8\),不然可能出現1366錯誤。

create database pythontest;

create table doubantop250(

id int primary key auto_increment,

rank int,

name varchar(50),

alias varchar(100),

director varchar(50),

showyear varchar(50),

makecountry varchar(50),

movietype varchar(50),

moviescore float,

scorenum int,

shortfilm varchar(255)

)engine=innodb default charset=utf8;

接下來在python**中新增乙個函式,將資料匯入資料庫。

def upload(self):

db = pymysql.connect("localhost", "root", "love1125", "pythontest", charset='utf8')

cursor = db.cursor()

insertstr = "insert into doubantop250(rank, name, alias, director," \

"showyear, makecountry, movietype, moviescore, scorenum, shortfilm)" \

"values (%d, '%s', '%s', '%s', '%s', '%s', '%s', %f, %d, '%s')"

try:

for movie in self.movielist:

insertsql = insertstr % (int(movie[0]), str(movie[1]), str(movie[2]), str(movie[3]),

str(movie[4]), str(movie[5]), str(movie[6]), float(movie[7]),

int(movie[8]), str(movie[9]))

cursor.execute(insertsql)

db.commit()

print('成功上傳至資料庫...')

except exception as e:

print(e)

db.rollback()

finally:

db.close()

完整**:

Scrapy框架抓取豆瓣電影的小爬蟲學習日記(三)

獲取到影片資訊之後,下一步就是要把獲取到的資訊進行儲存了。網上很多的案例都是儲存成json格式,這裡我想用mysql伺服器來儲存。1 首先安裝好mysql資料庫,建好filminfo表和字段。2 在items.py檔案中新增你需要儲存到資料庫中的資訊,定義相對應的class,生成item類物件。cl...

python爬蟲 豆瓣電影

最近學習python 順便寫下爬蟲練手 爬的是豆瓣電影排行榜 python版本2.7.6 安裝 beautiful soup sudo apt get install python bs4 安裝 requests sudo apt get install python requests下面是py a...

Python python抓取豆瓣電影top250

一直對爬蟲感興趣,學了python後正好看到某篇關於爬取的文章,就心血來潮實戰一把吧。實現目標 抓取豆瓣電影top250,並輸出到檔案中 1.找到對應的url 2.進行頁面元素的抓取 3.編寫 第一步 實現抓取第乙個頁面 第二步 將其他頁面的資訊也抓取到 第三步 輸出到檔案 4.5.結果 1 控制台...