python爬蟲貓眼電影TOP100(爬蟲入門基礎,同步入庫)

小編輾轉了比較長的一段時間,現在終於提筆於python的運用,這次嘗試也是一個開端。

本篇文章所爬取的數據網上已經有了很多版本,並不是什麼新鮮的數據,僅僅作爲個人進階的參考。

python爬蟲進階第S190811期

python爬蟲將會進一步深入到JavaScript渲染網頁(動態渲染)、驗證碼識別、代理設置、cookies池搭建等,有興趣的同道中人可以持續關注哈。

本次嘗試爬取小量電影數據並同步存入數據庫作爲預熱哈。

下面代碼分爲三塊:請求、解析網頁的模塊;網頁數據獲取模塊;數據同步入庫模塊

#需要用到的包載入
import requests
from  requests.exceptions  import RequestException
import lxml
from lxml import etree
import pymysql
import time



#定義headers,請求網頁並獲取網頁響應狀態,解析網頁,設置休眠時間,防止封禁,當然如此小的數據量不存在的
def main():
    url = 'http://maoyan.com/board/4?offset='
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT k0.0; Win64; x64)             AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.kk0 Safari/537.36'}
    for i in range(10):
        my_url=url+str(10*i)
        url_response = requests.get(my_url,headers=headers)
        html_analysis = etree.HTML(url_response.text)
        md=[]
        get_data(html_analysis,md)
        insert_sql(md)
        time.sleep(1)



#利用lxml庫xpath獲取網頁數據
def get_data(html_analysis,md):
#電影名稱
    name=html_analysis.xpath("//div[@class='movie-item-info']/p/a/@title")
#電影主演,裏面的人有多個,沒有進行拆分,有需要可以進行拆分
    actor=html_analysis.xpath("//div[@class='movie-item-info']/p[@class='star']/text()")
#電影上映時間
    time=html_analysis.xpath("//div[@class='movie-item-info']/p[@class='releasetime']/text()")
#電影評分(整數部分)
    score_int=html_analysis.xpath("//div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='integer']/text()")
#電影評分(小數部分)
    score_float=html_analysis.xpath("//div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='fraction']/text()")
#電影封面地址,沒有下載,只是獲取了地址,根據需求可以下載了存儲
    img=html_analysis.xpath("//a/img/@src")
#拼接電影評分
    score=[]
    for j in range(0,len(score_int)):
        score.append(score_int[j]+score_float[j])
#整合每頁數據,構造循環,用append函數實現
    for k in range(0,len(name)):
        movie_name=name[k].strip()
        movie_actor=actor[k].strip()
        movie_time=time[k].strip()
        movie_score=score[k].strip()
        movie_img=img[k].strip()
        md.append([movie_name,movie_actor,movie_time,movie_score,movie_img])


#連接數據庫,創建對應數據庫的電影數據存儲表,便於數據爬取後存入
db=pymysql.connect(host='localhost', user='root', password='密碼', port=3306,db='數據庫')
cursor = db.cursor()
#創建電影數據存儲表的語句用遊標寫,若已經存在創建的表則不會重複創建,當然這個表的參數設置是有些不合理的哈
sql_create='create table if not exists my_movie_data(id int auto_increment primary key,' \
           'movie_name varchar(255) not null,' \
            'movie_actor varchar(255) not null,' \
            'movie_time varchar(255) not null,' \
            'movie_score varchar(255) not null,' \
            'movie_img varchar(255) not null )'
cursor.execute(sql_create)
db.close()




#數據同步入庫
def insert_sql(data):
    db = pymysql.connect(host='localhost',
                             user='root',
                             password='密碼',
                             port=3306,
                             db='數據庫')
    cur = db.cursor()
    for i in data:
        my_data=i
#用格式化符%s來避免插入數據字符拼接的問題,value值用統一的元組來傳遞避免出錯
        sql = 'insert into my_movie_data(movie_name,movie_actor,movie_time,movie_score,movie_img) values(%s,%s,%s,%s,%s)'
#用遊標把數據同步入庫,當發生錯誤時候便會回滾,取消錯誤插入
        try:
            cur.execute(sql,my_data)
            db.commit()
            print('貓眼電影數據正在入庫')
        except:
                db.rollback()
                print('貓眼電影數據入庫失敗')
    cur.close()
    db.close()

#模塊調用,當name與main一致時候,在本腳本運行時候name=main,輸出本腳本的結果;在其他腳本運行時候name!=main,若在其他腳本中調用模塊則輸出其他腳本的結果,不會執行main模塊
if __name__== "__main__":
    main()

電影數據入庫(mysql)截圖:

下一篇可能是貓眼電影2.8w+經典電影數據

Any questions or doubts here,call me please,together to work it out.

歡迎關注小編微信公衆號:分享百科 松子 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章