小編輾轉(zhuǎn)了比較長(zhǎng)的一段時(shí)間,現(xiàn)在終于提筆于python的運(yùn)用,這次嘗試也是一個(gè)開(kāi)端。
本篇文章所爬取的數(shù)據(jù)網(wǎng)上已經(jīng)有了很多版本,并不是什么新鮮的數(shù)據(jù),僅僅作為個(gè)人進(jìn)階的參考。
python爬蟲(chóng)進(jìn)階第S190811期
python爬蟲(chóng)將會(huì)進(jìn)一步深入到JavaScript渲染網(wǎng)頁(yè)(動(dòng)態(tài)渲染)、驗(yàn)證碼識(shí)別、代理設(shè)置、cookies池搭建等,有興趣的同道中人可以持續(xù)關(guān)注哈。
本次嘗試爬取小量電影數(shù)據(jù)并同步存入數(shù)據(jù)庫(kù)作為預(yù)熱哈。
下面代碼分為三塊:請(qǐng)求、解析網(wǎng)頁(yè)的模塊;網(wǎng)頁(yè)數(shù)據(jù)獲取模塊;數(shù)據(jù)同步入庫(kù)模塊
#需要用到的包載入
import requests
from requests.exceptions import RequestException
import lxml
from lxml import etree
import pymysql
import time
#定義headers,請(qǐng)求網(wǎng)頁(yè)并獲取網(wǎng)頁(yè)響應(yīng)狀態(tài),解析網(wǎng)頁(yè),設(shè)置休眠時(shí)間,防止封禁,當(dāng)然如此小的數(shù)據(jù)量不存在的
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庫(kù)xpath獲取網(wǎng)頁(yè)數(shù)據(jù)
def get_data(html_analysis,md):
#電影名稱(chēng)
name=html_analysis.xpath("http://div[@class='movie-item-info']/p/a/@title")
#電影主演,里面的人有多個(gè),沒(méi)有進(jìn)行拆分,有需要可以進(jìn)行拆分
actor=html_analysis.xpath("http://div[@class='movie-item-info']/p[@class='star']/text()")
#電影上映時(shí)間
time=html_analysis.xpath("http://div[@class='movie-item-info']/p[@class='releasetime']/text()")
#電影評(píng)分(整數(shù)部分)
score_int=html_analysis.xpath("http://div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='integer']/text()")
#電影評(píng)分(小數(shù)部分)
score_float=html_analysis.xpath("http://div[@class='board-item-content']/div[contains(@class,'movie-item-number')]/p[@class='score']/i[@class='fraction']/text()")
#電影封面地址,沒(méi)有下載,只是獲取了地址,根據(jù)需求可以下載了存儲(chǔ)
img=html_analysis.xpath("http://a/img/@src")
#拼接電影評(píng)分
score=[]
for j in range(0,len(score_int)):
score.append(score_int[j]+score_float[j])
#整合每頁(yè)數(shù)據(jù),構(gòu)造循環(huán),用append函數(shù)實(shí)現(xiàn)
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])
#連接數(shù)據(jù)庫(kù),創(chuàng)建對(duì)應(yīng)數(shù)據(jù)庫(kù)的電影數(shù)據(jù)存儲(chǔ)表,便于數(shù)據(jù)爬取后存入
db=pymysql.connect(host='localhost', user='root', password='密碼', port=3306,db='數(shù)據(jù)庫(kù)')
cursor = db.cursor()
#創(chuàng)建電影數(shù)據(jù)存儲(chǔ)表的語(yǔ)句用游標(biāo)寫(xiě),若已經(jīng)存在創(chuàng)建的表則不會(huì)重復(fù)創(chuàng)建,當(dāng)然這個(gè)表的參數(shù)設(shè)置是有些不合理的哈
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()
#數(shù)據(jù)同步入庫(kù)
def insert_sql(data):
db = pymysql.connect(host='localhost',
user='root',
password='密碼',
port=3306,
db='數(shù)據(jù)庫(kù)')
cur = db.cursor()
for i in data:
my_data=i
#用格式化符%s來(lái)避免插入數(shù)據(jù)字符拼接的問(wèn)題,value值用統(tǒng)一的元組來(lái)傳遞避免出錯(cuò)
sql = 'insert into my_movie_data(movie_name,movie_actor,movie_time,movie_score,movie_img) values(%s,%s,%s,%s,%s)'
#用游標(biāo)把數(shù)據(jù)同步入庫(kù),當(dāng)發(fā)生錯(cuò)誤時(shí)候便會(huì)回滾,取消錯(cuò)誤插入
try:
cur.execute(sql,my_data)
db.commit()
print('貓眼電影數(shù)據(jù)正在入庫(kù)')
except:
db.rollback()
print('貓眼電影數(shù)據(jù)入庫(kù)失敗')
cur.close()
db.close()
#模塊調(diào)用,當(dāng)name與main一致時(shí)候,在本腳本運(yùn)行時(shí)候name=main,輸出本腳本的結(jié)果;在其他腳本運(yùn)行時(shí)候name!=main,若在其他腳本中調(diào)用模塊則輸出其他腳本的結(jié)果,不會(huì)執(zhí)行main模塊
if __name__== "__main__":
main()
電影數(shù)據(jù)入庫(kù)(mysql)截圖:
下一篇可能是貓眼電影2.8w+經(jīng)典電影數(shù)據(jù)
Any questions or doubts here,call me please,together to work it out.
歡迎關(guān)注小編微信公眾號(hào):分享百科 松子?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

