欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python爬蟲 貓眼電影和電影天堂數據csv和mysql存儲過程解析

系統 1934 0

字符串常用方法

            
# 去掉左右空格
'hello world'.strip()  # 'hello world'
# 按指定字符切割
'hello world'.split(' ') # ['hello','world']
# 替換指定字符串
'hello world'.replace(' ','#') # 'hello#world'
          

csv模塊

作用:將爬取的數據存放到本地的csv文件中

使用流程

  • 導入模塊
  • 打開csv文件
  • 初始化寫入對象
  • 寫入數據(參數為列表)
            
import csv
with open('test.csv','w') as f: 
 writer = csv.writer(f) # 初始化寫入對象
 # 寫一行
 writer.writerow(['超哥哥',20])
 writer.writerow(['步驚云',22])
with open('test.csv','a') as f:
 writer = csv.writer(f)
 # 寫多行
 data_list = [('聶風',23),('秦霜',30)]
 writer.writerows(data_list)
          

Windows中使用csv模塊默認會在每行后面添加一個空行,使用newline=''可解決

with open('xxx.csv','w',newline='') as f:

貓眼電影top100抓取案例

確定URL網址

貓眼電影 - 榜單 - top100榜 目標

電影名稱、主演、上映時間 操作步驟

1、查看是否為動態加載

右鍵 - 查看網頁源代碼 - 搜索爬取關鍵字(查看在源代碼中是否存在)

2、找URL規律

  • 第1頁:https://maoyan.com/board/4?offset=0
  • 第2頁:https://maoyan.com/board/4?offset=10
  • 第n頁:offset=(n-1)*10

3、正則表達式

.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

4、編寫程序框架,完善程序

  • 打印程序執行時間
  • 隨機的User-Agent,(確保每次發請求使用隨機)
  • 數據爬下來后做處理(字符串),定義成字典
  • 一條龍: 獲取 -> 調用解析 -> 數據處理
  • 貓眼電影數據存入本地 maoyanfilm.csv 文件
              
from urllib import request
import time
import re
import csv
import random
class MaoyanSpider(object):
 def __init__(self):
  self.page = 1 # 用于記錄頁數
  self.url = 'https://maoyan.com/board/4?offset={}'
  self.agent = [
   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 \
   Safari/535.1',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; \
   .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)',
   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1']

 # 請求
 def get_page(self, url):
  headers = {'User-Agent': random.choice(self.agent)} # 每次使用隨機的user-agent
  req = request.Request(url=url, headers=headers)  # 創建請求對象
  res = request.urlopen(req)       # 發起請求
  html = res.read().decode('utf-8')     # 獲取請求內容
  self.parse_page(html)        # 直接調用解析函數

 # 解析
 def parse_page(self, html):
  pattren = re.compile(
   '
              
.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

', re.S) r_list = pattren.findall(html) # rlist: [('霸王別姬', '\n 主演:張國榮,張豐毅,鞏俐\n ', '上映時間:1993-01-01'),(...),(...)] self.write_page(r_list) # 寫入csv文件 # # 保存,打印輸出 # def write_page(self,r_list): # one_film_dict = {} # for rt in r_list: # one_film_dict['name'] = rt[0].strip() # one_film_dict['star'] = rt[1].strip() # one_film_dict['time'] = rt[2].strip()[5:15] # # print(one_film_dict) # 保存到csv文件(writerows) -- 推薦使用此方法 def write_page(self, r_list): # 空列表,最終writerows()的參數: [(),(),()] film_list = [] with open('maoyan.csv', 'a',newline="") as f: writer = csv.writer(f) for rt in r_list: # 把處理過的數據定義成元組 t = (rt[0], rt[1].strip(), rt[2].strip()[5:15]) film_list.append(t) writer.writerows(film_list) def main(self): for offset in range(0, 31, 10): url = self.url.format(offset) self.get_page(url) time.sleep(random.randint(1, 3)) print('第%d頁爬取完成' % self.page) self.page += 1 if __name__ == '__main__': start = time.time() spider = MaoyanSpider() spider.main() end = time.time() print('執行時間: %.2f' % (end - start))

數據持久化存儲(MySQL數據庫)

讓我們來回顧一下pymysql模塊的基本使用

              
import pymysql

db = pymysql.connect('localhost', 'root', '123456', 'maoyandb', charset='utf8')
cursor = db.cursor() # 創建游標對象
# execute()方法第二個參數為列表傳參補位
cursor.execute('insert into film values(%s,%s,%s)', ['霸王別姬', '張國榮', '1993'])
db.commit() # 提交到數據庫執行
cursor.close() # 關閉
db.close()
            

讓我們來回顧一下pymysql中executemany()的用法

              
import pymysql

# 數據庫連接對象
db = pymysql.connect('localhost', 'root', '123456', charset='utf8')
cursor = db.cursor() # 游標對象
ins_list = []   # 存放所有數據的大列表
for i in range(2):
 name = input('請輸入第%d個學生姓名:' % (i + 1))
 age = input('請輸入第%d個學生年齡:' % (i + 1))
 ins_list.append([name, age])

ins = 'insert into t3 values(%s,%s)' # 定義插入語句
cursor.executemany(ins, ins_list) # 一次數據庫的IO操作可插入多條語句,提升性能

db.commit()  # 提交到數據庫執行
cursor.close() # 關閉游標
db.close()  # 關閉數據庫

ins = 'insert into maoyanfilm values(%s,%s,%s)'
cursor.execute(['霸王', '國榮', '1991'])
cursor.executemany([
  ['月光寶盒', '周星馳', '1993'],
  ['大圣娶親', '周星馳', '1993']])
            

練習:把貓眼電影案例中電影信息存入MySQL數據庫中(盡量使用executemany方法)

              
from urllib import request
import time
import re
import pymysql
import random
class MaoyanSpider(object):
 def __init__(self):
  self.page = 1 # 用于記錄頁數
  self.url = 'https://maoyan.com/board/4?offset={}'
  self.ua_list = [
   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) \
   Chrome/14.0.835.163 Safari/535.1',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; \
   .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)']
  # 創建數據庫連接對象和游標對象
  self.db = pymysql.connect('localhost', 'root', '123456', 'maoyandb', charset='utf8')
  self.cursor = self.db.cursor()
 # 獲取
 def get_page(self, url):
  # 每次使用隨機的user-agent
  headers = {'User-Agent': random.choice(self.ua_list)}
  req = request.Request(url=url, headers=headers)
  res = request.urlopen(req)
  html = res.read().decode('utf-8')
  self.parse_page(html)  # 直接調用解析函數

 # 解析
 def parse_page(self, html):
  pattren = re.compile(
   '
              
.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

', re.S) # rlist: [('霸王別姬','張國榮','1993'),(),()] r_list = pattren.findall(html) print(r_list) self.write_page(r_list) # 存入mysql數據庫(executemany([ [],[],[] ])) def write_page(self, r_list): film_list = [] ins = 'insert into filmtab values(%s,%s,%s)' # 定義插入語句 # 處理數據,放到大列表film_list中 for rt in r_list: one_film = [rt[0], rt[1].strip(), rt[2].strip()[5:15]] # 添加到大列表中 film_list.append(one_film) # 一次數據庫IO把1頁數據存入 self.cursor.executemany(ins, film_list) # 提交到數據庫執行 self.db.commit() def main(self): for offset in range(0, 31, 10): url = self.url.format(offset) self.get_page(url) time.sleep(random.randint(1, 3)) print('第%d頁爬取完成' % self.page) self.page += 1 # 斷開數據庫(所有頁爬完之后) self.cursor.close() self.db.close() if __name__ == '__main__': start = time.time() spider = MaoyanSpider() spider.main() end = time.time() print('執行時間: %.2f' % (end - start))

讓我們來做個SQL命令查詢

1、查詢20年以前的電影的名字和上映時間

select name,time from filmtab where time<(now()-interval 20 year);

2、查詢1990-2000年的電影名字和上映時間

select name,time from filmtab where time>='1990-01-01' and time<='2000-12-31';

讓我們來復習一下mongdb數據庫

              
import pymongo
# 1.連接對象
conn = pymongo.MongoClient(host='127.0.0.1', port=27017)
db = conn['maoyandb']  # 2.庫對象
myset = db['filmtab']  # 3.集合對象
myset.insert_one({'name': '趙敏'}) # 4.插入數據庫
            

練習:把貓眼電影案例中電影信息存入MongDB數據庫中

              
from urllib import request
import re
import time
import random
import pymongo
class MaoyanSpider(object):
 def __init__(self):
  self.url = 'https://maoyan.com/board/4?offset={}'
  # 計數
  self.num = 0
  # 創建3個對象
  self.conn = pymongo.MongoClient('localhost', 27017)
  self.db = self.conn['maoyandb']
  self.myset = self.db['filmset']
  self.ua_list = [
   'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
   'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
   'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET \
   CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)', ]

 def get_html(self, url):
  headers = {
   'User-Agent': random.choice(self.ua_list)
  }
  req = request.Request(url=url, headers=headers)
  res = request.urlopen(req)
  html = res.read().decode('utf-8')
  # 直接調用解析函數
  self.parse_html(html)

 def parse_html(self, html):
  re_bds = r'
              
.*?title="(.*?)".*?class="star">(.*?)

.*?releasetime">(.*?)

' pattern = re.compile(re_bds, re.S) # film_list: [('霸王別姬','張國榮','1993'),()] film_list = pattern.findall(html) # 直接調用寫入函數 self.write_html(film_list) # mongodb數據庫 def write_html(self, film_list): for film in film_list: film_dict = { 'name': film[0].strip(), 'star': film[1].strip(), 'time': film[2].strip()[5:15] } # 插入mongodb數據庫 self.myset.insert_one(film_dict) def main(self): for offset in range(0, 31, 10): url = self.url.format(offset) self.get_html(url) time.sleep(random.randint(1, 2)) if __name__ == '__main__': start = time.time() spider = MaoyanSpider() spider.main() end = time.time() print('執行時間:%.2f' % (end - start))

電影天堂案例(二級頁面抓取)

1、查看是否為靜態頁面,是否為動態加載

  右鍵 - 查看網頁源代碼

2、確定URL地址

  百度搜索 :電影天堂 - 2019年新片 - 更多

3、目標

*********一級頁面***********
1、電影名稱
2、電影鏈接
*********二級頁面***********

1、下載鏈接

4、步驟

找URL規律

第1頁 :https://www.dytt8.net/html/gndy/dyzz/list_23_1.html

第2頁 :https://www.dytt8.net/html/gndy/dyzz/list_23_2.html

第n頁 :https://www.dytt8.net/html/gndy/dyzz/list_23_n.html

寫正則表達式

1、一級頁面正則表達式(電影名稱、電影詳情鏈接)

(.*?)

2、二級頁面正則表達式

.*?
                      
from urllib import request
import re
import time
import random
from useragents import *
import pymysql
class FilmSky(object):
 def __init__(self):
  self.url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
  # 定義兩個對象
  self.db = pymysql.connect('127.0.0.1', 'root', '123456', 'maoyandb', charset='utf8')
  self.cursor = self.db.cursor()

 # 獲取html函數(因為兩個頁面都需要發請求)
 def get_page(self, url):
  req = request.Request(url=url, headers={'User-Agent': random.choice(ua_list)})
  res = request.urlopen(req)
  # ignore參數,實在處理不了的編碼錯誤忽略
  # 查看網頁源碼,發現網頁編碼為 gb2312,不是 utf-8
  html = res.read().decode('gbk', 'ignore')
  return html

 # 解析提取數據(把名稱和下載鏈接一次性拿到)
 # html為一級頁面響應內容
 def parse_page(self, html):
  # 1. 先解析一級頁面(電影名稱 和 詳情鏈接)
  pattern = re.compile('
                      
                        (.*?)
                      
                      
                        .*?
                        ', re.S)
  # film_list: [('詳情鏈接','名稱'),()]
  film_list = pattern.findall(html)
  # [('/html/gndy/dyzz/20190806/58956.html', '019年驚悚動作《報仇雪恨/血債血償》BD中英雙字幕'),(),()]
  ins = 'insert into filmsky values(%s,%s)'
  for film in film_list:
   film_name = film[1]
   film_link = 'https://www.dytt8.net' + film[0]
   # 2. 拿到詳情鏈接后,再去獲取詳情鏈接html,提取下載鏈接
   download_link = self.parse_two_html(film_link)

   self.cursor.execute(ins, [film_name, film_link])
   self.db.commit()

   # 打印測試
   d = {'電影名稱': film_name, '下載鏈接': download_link}
   print(d)

 # {'電影名稱': '019年驚悚動作《報仇雪恨/血債血償》BD中英雙字幕', '下載鏈接': 'ftp://ygdy8:ygdy8@yg90.dydytt.net:8590/陽光電影www.ygdy8.com.報仇雪恨.BD.720p.中英雙字幕.mkv'}
 # 解析二級頁面,獲取下載鏈接
 def parse_two_html(self, film_link):
  two_html = self.get_page(film_link)
  pattern = re.compile('
                        


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩一区二区精品视频 | 精品视频一区二区三区在线播放 | 欧美在线亚洲 | 日本99精品| 超级碰97 | 污视频免费在线观看 | 亚洲国产精品欧美综合 | 好吊色欧美一区二区三区四区 | 精品一区久久 | 成人久久久 | 成人练习生演员 | 草草国产成人免费视频 | 欧美精品一区二区三区蜜桃视频 | 四虎国产视频 | 精品国产91亚洲一区二区三区www | 精品国产三级 | 一区二区三区在线免费观看 | 天天人人精品 | 日韩精品在线视频 | 中国一级大黄大黄大色毛片 | 国产精品视频播放 | 免费人成网站线观看合集 | 岛国毛片一级一级特级毛片 | 日日摸夜夜添夜夜 | 久久国产精品久久久久久久久久 | 亚洲一区二区免费视频 | 日韩国产无矿砖一线二线图 | 瑟瑟网站免费网站入口 | 国产精品福利在线观看 | 欧美aⅴ片| 国产在线不卡一区 | 99热久久精品免费精品 | 亚洲精品久久久久久国产精华液 | 青青青青娱乐 | 男女进进出出动态图啪啪 | 精品久久久久久久中文字幕 | 毛片成人永久免费视频 | feise.av | 欧美成人私人视频88在线观看 | 精品欧美| 97av视频在线播放 |