小編輾轉了比較長的一段時間,現在終於提筆於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()