1. 準備工作
最近在寫畢業課設,需要一些電影的信息,所以網上找了一些代碼自己做了修改。在爬取之前先在你的數據庫建立movie表,以下是我自己建的表,你可以根據自己需求設計字段。
細心的網友會發現字段paihang爲啥不用rank顯得高大尚一點,我也想用,但是在插入數據的時候會插入不成功,然後把字段改成paihang就竟然插入成功了。這個奇葩的錯誤我剛開始以爲表的字段太多了,發現只要改名就行了。如果有知道原因的網友,希望可以在我的評論區留言。
2. 測試數據庫是否能插入數據
有了數據庫表格後,你需要測試一下你的表是否能插入數據。
def test_SQinsert():
db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='paper', charset='utf8')
# 創建數據庫遊標
cursor = db.cursor()
sql = "INSERT INTO movie(name,id,actor,gener,country,release_data,rate,paihang,comment) \
VALUES ('%s','%s','%s','%s','%s','%s','%f','%d','%d')" % \
('Mac', 'Mo22222', 'Mohan', 'Mohan', 'Mohan', 'dd', 1.2, 99,88)
try:
# 執行sql語句
cursor.execute(sql)
db.commit()
print("insert ok")
except pymysql.Error as e:
# 發生錯誤時回滾
db.rollback()
print('no OK')
# 打印錯誤
print(e)
3. python爬蟲
# coding:utf-8
import csv
import requests
from lxml import html
from lxml import etree
from urllib.request import urlopen,Request
import pymysql
def list_douban_top250():
db = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='lin936144524', db='paper', charset='utf8')
# 創建數據庫遊標
cursor = db.cursor()
#創建CSV文件,並寫入表頭信息
fp = open('movie.csv','a',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(('movie_id','電影名','電影類型','導演演員信息','發行日期','製片國家','評分','評論數','排名'))
print('正在獲取豆瓣TOP250影片信息並存入數據庫...')
index = 1
page_count = 10
all_link = []
for i in range(page_count):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i * 25)
# 模擬瀏覽器訪問
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36",}
ret = Request(url, headers=headers)
res = urlopen(ret)
# 內容節點
doc = etree.HTML(res.read())
# 獲取電影鏈接作爲movie表格id
url_list=doc.xpath('//div[@class="pic"]/a/@href')
for url in url_list:
if 'https://movie.douban.com/subject/' in str(url):
all_link.append(url)
for y in doc.xpath('//div[@class="info"]'):
# 影片名稱
name = y.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0]
# 影片詳情
move_content = y.xpath('div[@class="bd"]/p[1]/text()')
# 導演演員信息
actor = move_content[0].replace(" ", "").replace("\n", "").replace("\xa0","")
# 上映日期
date = move_content[1].replace(" ", "").replace("\n", "").replace("\xa0","").split("/")[0]
# 製片國家
country = move_content[1].replace(" ", "").replace("\n", "").replace("\xa0","").split("/")[1]
# 影片類型
gener = move_content[1].replace(" ", "").replace("\n", "").replace("\xa0","").split("/")[2]
# 評分
rate = y.xpath('div[@class="bd"]/div[@class="star"]/span[2]/text()')[0]
# 評論人數
com_count = y.xpath('div[@class="bd"]/div[@class="star"]/span[4]/text()')[0].replace('人評價', '')
# 執行log
print('TOP%s--%s--評分%s--人數%s' % (str(index), name, rate, com_count))
# 寫入csv
writer.writerow((all_link[index-1],name,gener,actor,date,country,rate,com_count,index))
# 寫入MySQL
sql = "INSERT INTO movie(id,name,gener,actor,release_data,country,rate,comment,paihang) \
VALUES ('%s','%s','%s','%s','%s','%s','%f','%d','%d')"% \
(all_link[index-1],str(name),str(gener),str(actor),str(date),str(country),round(float(rate),1),int(com_count),index)
try:
cursor.execute(sql)
db.commit()
print("結果已提交")
except pymysql.Error as e:
db.rollback()
print("數據已回滾",e)
index += 1
print('任務執行完成!')
cursor.close()
db.close()
fp.close()
list_douban_top250()
4. 結果顯示
- csv
打開會發現是亂碼,用文本文檔打開,改一下編碼格式爲ANSI就可以了。
- movie表
5. 參考文獻
- https://www.jianshu.com/p/e49bdec40cac
- https://www.bbsmax.com/A/l1dybyM9ze/