python爬蟲--爬取某網站電影信息並寫入mysql數據庫


書接上文,前文最后提到將爬取的電影信息寫入數據庫,以方便查看,今天就具體實現。

首先還是上代碼:

# -*- coding:utf-8 -*-
import requests
import re
import mysql.connector

#changepage用來產生不同頁數的鏈接
def changepage(url,total_page):
    page_group = ['https://www.dygod.net/html/gndy/jddy/index.html']
    for i in range(2,total_page+1):
        link = re.sub('jddy/index','jddy/index_'+str(i),url,re.S)
        page_group.append(link)
    return page_group
#pagelink用來產生頁面內的視頻鏈接頁面
def pagelink(url):
    base_url = 'https://www.dygod.net/html/gndy/jddy/'
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定編碼,否則會亂碼
    pat = re.compile('<a href="/html/gndy/jddy/(.*?)" class="ulink" title=(.*?)/a>',re.S)#獲取電影列表網址
    reslist = re.findall(pat, req.text)

    finalurl = []
    for i in range(1,25):
        xurl = reslist[i][0]
        finalurl.append(base_url + xurl)
    return finalurl #返回該頁面內所有的視頻網頁地址

#getdownurl獲取頁面的視頻地址和信息
def getdownurl(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    req = requests.get(url , headers = headers)
    req.encoding = 'gbk'#指定編碼,否則會亂碼
    
    pat = re.compile('<a href="ftp(.*?)">ftp',re.S)#獲取下載地址
    reslist = re.findall(pat, req.text)
    furl = 'ftp'+reslist[0]
    
    pat2 = re.compile('<!--Content Start-->(.*?)<!--duguPlayList Start-->',re.S)#獲取影片信息
    reslist2 = re.findall(pat2, req.text)
    reslist3 = re.sub('[<p></p>]','',reslist2[0])
    fdetail = reslist3.split('')
    
    return (furl,fdetail)
    
#創建表movies
def createtable(con,cs):
    #創建movies表,確定其表結構:
    cs.execute('create table if not exists movies (film_addr varchar(1000), cover_pic varchar(1000), name varchar(100) primary key,\
     ori_name varchar(100),prod_year varchar(100), prod_country varchar(100), category varchar(100), language varchar(100), \
     subtitle varchar(100), release_date varchar(100), score varchar(100), file_format varchar(100), video_size varchar(100), \
     file_size varchar(100), film_length varchar(100), director varchar(100), actors varchar(500), profile varchar(2000),capt_pic varchar(1000))')
    # 提交事務:
    con.commit()
        
#將電影地址和簡介插入表中
def inserttable(con,cs,x,y):
    try:
        cs.execute('insert into movies values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)',\
    (x,y[0],y[1],y[2],y[3],y[4],y[5],y[6],y[7],y[8],y[9],y[10],y[11],y[12],y[13],y[14],y[15],y[16],y[17]))
    except:
        pass
    finally:
        con.commit()
        
if __name__ == "__main__" :
    html = "https://www.dygod.net/html/gndy/jddy/index.html"
    print('你即將爬取的網站是:https://www.dygod.net/html/gndy/jddy/index.html')
    pages = input('請輸入需要爬取的頁數:')
    createtable
    p1 = changepage(html,int(pages))
    
    #打開數據庫
    conn = mysql.connector.connect(user='py', password='Unix_1234', database='py_test')
    cursor = conn.cursor()
    createtable(conn,cursor)
    #插入數據
    j = 0
    for p1i in p1 :
        j = j + 1
        print('正在爬取第%d頁,網址是 %s ...'%(j,p1i))
        p2 = pagelink(p1i)
        for p2i in p2 :
            p3,p4 = getdownurl(p2i)
            if len(p3) == 0 :
                pass
            else :
                inserttable(conn,cursor,p3,p4)
    #關閉數據庫
    cursor.close()
    conn.close()
    print('所有頁面地址爬取完畢!')

用到的知識點和前面比,最重要是多了數據庫的操作,下面簡要介紹下python如何連接數據庫。

一、python中使用mysql需要驅動,常用的有官方的mysql-connect-python,還有mysqldb(Python 2.x)和pymysql(Python 3.x),這幾個模塊既是驅動,又是工具,可以用來直接操作mysql數據庫,也就是說它們是通過在Python中寫sql語句來操作的,例如創建user表:

cursor.execute('create table user (id int, name varchar(20))')

#這里的create table語句就是典型的sql語句。

二、還有很多情況下我們用ORM(object relational mapping)即對象映射關系框架,將編程語言的對象模型和數據庫的關系模型(RDBMS關系型數據庫)進行映射,這樣可以直接使用編程語言的對象模型操作數據庫,而不是使用sql語言。同樣創建user表:

user=Table('user',metadata,
Column('id',Integer),
Column('name', String(20))
)
metadata.create_all()
#這里可以看到根本沒有sql語句的影子,這樣我們可以專注在Python代碼而不是sql代碼上了。(注意ORM並不包含驅動,如要使用同樣要安裝前面提到的驅動)

如有興趣可以自行學習,這不是本文的重點。為簡單起見,文中用的是mysql-connect-python。

正則匹配部分也很簡單,因為源網頁比較規則,如下網頁圖和對應的源代碼:

 

 

直接用◎匹配即可。

程序運行完后,數據都寫入movies表中。

比如我想篩選豆瓣評分>7的,

是不是很簡單,你GET到了嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM