書接上文,前文最后提到將爬取的電影信息寫入數據庫,以方便查看,今天就具體實現。
首先還是上代碼:
# -*- 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到了嗎?
