1. 程式人生 > >【爬蟲】爬取貓眼電影top100

【爬蟲】爬取貓眼電影top100

用正則表示式爬取

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json     #  快速匯入此模組:滑鼠先點到要匯入的函式處,再Alt + Enter進行選擇
from multiprocessing.pool import Pool  #引入程序池

import requests
import re
import csv
from requests.exceptions import RequestException   #引入異常

## 正確儲存,無丟失

# 請求一個頁面返回響應內容
#以《霸王別姬》為列,右擊—檢視元素—會顯示一個網頁資訊
def get_one_page(url,offset):
    try:
        response=requests.get(url=url,params={"offset":offset})
        if response.status_code==200:   #由狀態碼判斷返回結果,200表示請求成功,300,500表出錯
            return response.text   #返回網頁內容
        else:return None
    except RequestException as e:
            return None

# 解析一個頁面
def parse_one_page(html):
    pattern = ('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>')
    #寫個正則,匹配所有結果。這裡由上面的網頁相應內容寫<dd>開頭,.*?匹配任意字元穿  board-index匹配識別符號,類名,
    # \d 表數字即排名,'+'表示匹配至少一個可多個數字,</i>右邊結束符
    #“?”,問號表示  非貪婪匹配,就是一旦匹配到就不在繼續往後面嘗試。
    #而\(和\)分別表示匹配一個“(”和“)”
    # re.S匹配多行
    regex = re.compile(pattern,re.S)   #一個方法,通過一個正則表示式字串編譯生成一個正則表示式物件,re.S 匹配任意字元
    items = regex.findall(html)    #以列表形式返回全部能匹配的子串. eg: re.findall(pattern, string[, flags])
    for item in items:    #將結果以字典形式返回,鍵值對
         yield{        #把這個方法變成一個生成器
             'index':item[0],
             'image':item[1],
             'title':item[2],
             'actor':item[3].strip()[3:],   #用strip()去掉換行符,不想要 主演: 這三個字就用[3:]組成一個切片,name就可以將前三個字串去掉
             'time':get_release_time(item[4].strip()[5:]),     #去掉前五個字元
             'area':get_release_area(item[4].strip()[5:]),
             'score':item[5]+item[6]    #將評分整數部分和小數部分結合起來
        }

'''
#儲存到txt,會發現中文漢字變成了unic的編碼,加上encoding='utf-8',ensure_ascii=False,則漢字可正常輸出
def  write_to_file(content):
    with open('result.txt','a',encoding='utf-8') as f:   # 引數 a ,表示直接往後追加
        f.write(json.dumps(content,ensure_ascii=False) +'\n')    #content是一個字典的形式,用json.dumps 把它轉換為字串,再加個換行符
        f.close()    
#json.dumps :dict 轉換為 str 
#json.loads: str 轉換為 dict
'''
''''''
# 獲取上映時間   <p class="releasetime">上映時間:1993-01-01(中國香港)</p>
def get_release_time(data):
    pattern = '^(.*?)(\(|$)'
    regex = re.compile(pattern)
    w = regex.search(data)
    return w.group(1)   # group(1)指的是第一個括號裡的東西

# 獲取上映地區
def get_release_area(data):
    pattern = '.*\((.*)\)' #而\(和\)分別表示匹配一個 '(' 和 ')'
    regex = re.compile(pattern)
    w = regex.search(data)
    if w is None:
        return'未知'
    return w.group(1)

# 獲取封面大圖,不需要
# def get_large_thumb(url):
#     pattern = '(.*?)@.*?'
#     regex = re.compile(pattern)
#     w = regex.search(url)
#     return w.group(1)

# 儲存資料
def store_data(item):
    with open('movie.csv','a',newline='',encoding='utf-8') as data_csv:
        # dialect為開啟csv檔案的方式,預設是excel,delimiter="\t"引數指寫入的時候的分隔符
        csv_writer = csv.writer(data_csv)
        csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']])
# 引數newline是用來控制文字模式之下,一行的結束字元。可以是None,’’,\n,\r,\r\n等。
'''
也可判斷異常,一般沒錯
        try:
            csv_writer = csv.writer(data_csv)
            csv_writer.writerow([item['index'], item['image'], item['title'], item['actor'],item['time'],item['area'],item['score']])
        except Exception as e:
            print(e)
            print(item)
'''

# 下載封面圖
#讀方式開啟的話,並不會新建;寫方式開啟的話就會新建。  r只讀,w可寫,a追加
def download_thumb(title,image):
    try:
        response = requests.get(image)
        # 獲取二進位制資料
        with open('image/'+title+'.jpg', 'wb') as f:   #將封面圖儲存到當前路徑下的image資料夾中,圖片名稱為:電影名.jpg
            f.write(response.content)
            f.close()
    except RequestException as e:
        print(e)
        pass


# 主排程程式
def main():
    # 起始URL
    start_url = 'http://maoyan.com/board/4?'
    for i in range(0,1000,10):
        # 獲取響應文字內容
        html = get_one_page(url=start_url, offset=i)
        if html is None:
            print('連結:%s?offset=%s異常'.format(start_url,i))
            continue
        for item in parse_one_page(html):
            # print(item)
            store_data(item)
            # download_thumb(item['title'],item['image'])
#

if __name__=='__main__':
    main()

'''
if __name__=='__main__':
    for i in range(10):
        main(i*10)
'''

'''
if __name__=='__main__':
    for i in range(10):
        main(i*10)
    pool=Pool()   #可以提供指定數量的程序供使用者呼叫,如果有一個新的請求被提交到程序池,程序池還沒有滿,就會建立新的程序來執行請求,如果滿了,就先等待
    pool.map(main,[i*10 for i in range(10)]) #將陣列中的每一個元素拿出來當做函式的引數,然後建立一個個的程序,放到程序池裡面去執行;第二個引數是構造一個數組,組成迴圈
    #速度明顯變快!1s
'''
儲存到資料庫
def main(offset):
    url='http://maoyan.com/board/4?offset='+str(offset)
    html=get_one_page(url)
    # for item in parse_one_page(html):
    #     print(item['number'])   #能正確輸出  , charset="utf8"
    try:
        conn = pymysql.connect(host='localhost', user='root', passwd=' ', port=3306,db='test1',charset="utf8",use_unicode = False )
        cur = conn.cursor()  # 建立一個遊標物件
        for item in parse_one_page(html):
            try:
                # sql = "INSERT INTO movies (number,picture,title,actors,time,area,score) VALUES (%s,%s,%s,%s,%s,%s,%s)"
                # cur.execute(sql, ( item['number'],item['picture'],item['title'],item['actors'],item['time'],item['area'],item['score']))
                sql = "insert into test_movies (number,picture,title,actors,time,area,score) values(%s,%s,%s,%s,%s,%s,%s)"
                cur.execute(sql, (item['number'], item['picture'], item['title'], item['actors'], item['time'], item['area'],item['score']))
            except pymysql.Error as e:
                print(e)
            print('- - - - - 資料儲存成功 - - - - -')
        conn.commit()
        cur.close()
        conn.close() # 關閉資料
    except pymysql.Error as e:
        print("Mysql Error %d: %s" % (e.args[0], e.args[1]))


if __name__=='__main__':
   # 連線資料庫
   conn = pymysql.connect(host='localhost', user='root', passwd=' ', port=3306, db='test1', charset="utf8")
   cur = conn.cursor()  # 建立一個遊標物件
   cur.execute("DROP TABLE IF EXISTS test_movies")  # 如果表存在則刪除
   # 建立表sql語句
   sqlc = """CREATE TABLE test_movies(
       number int not null primary key auto_increment,
       picture VARCHAR(100) NOT NULL,
       title VARCHAR(100) NOT NULL,
       actors VARCHAR(200) NOT NULL,
       time VARCHAR(100) NOT NULL,
       area VARCHAR(100) ,
       score VARCHAR(50) NOT NULL
   )"""
   cur.execute(sqlc)  # 執行建立資料表操作
   pool=Pool()
   pool.map(main,[i*10 for i in range(10)])


相關推薦

爬蟲貓眼電影top100

用正則表示式爬取 #!/usr/bin/python # -*- coding: utf-8 -*- import json # 快速匯入此模組:滑鼠先點到要匯入的函式處,再Alt + Enter進行選擇 from multiprocessing.pool im

爬蟲練習 | 貓眼電影Top100

#coding=utf-8 _date_ = '2018/12/9 16:18' import requests import re import json import time def get_one_page(url): headers={ 'User-Agent':'Mozil

python爬蟲貓眼電影top100

import requests from bs4 import BeautifulSoup url_list = [] all_name = [] all_num = [] all_actor = [] all_score = [] class Product_url():

PythonRequests+正則表示式 貓眼電影TOP100

1.先獲取到一個頁面,狀態碼200是成功返回 def get_one_page(url): # 獲取一個頁面 try: response = requests.get(url) if response.status_cod

爬蟲(七):貓眼電影top100

all for rip pattern 分享 爬取 values findall proc 一:分析網站 目標站和目標數據目標地址:http://maoyan.com/board/4?offset=20目標數據:目標地址頁面的電影列表,包括電影名,電影圖片,主演,上映日期以

Python爬蟲實戰之Requests+正則表示式貓眼電影Top100

import requests from requests.exceptions import RequestException import re import json # from multiprocessing import Pool # 測試了下 這裡需要自己新增頭部 否則得不到網頁 hea

python爬蟲貓眼電影top100

這個爬蟲我是跟著教程做的,也是第一次用python的re和multiprocessing(多執行緒),還知道了yield生成器的用法。不過re正則表示式真的厲害,但是學起來比較難,還在學習中。import requests import re import pymysql f

Python爬蟲-貓眼電影Top100榜單

貓眼電影的網站html組成十分簡單。 地址就是很簡單的offset=x 這個x引數更改即可翻頁。 下面的資訊使用正則表示式很快就可以得出結果。 直接放程式碼: import json

網路爬蟲豆瓣電影Top250評論

前言 本爬蟲大致流程為: (1)分析網頁——分析網站結構 (2)傳送請求——通過requests傳送請求 (3)響應請求——得到請求響應的頁面 (4)解析響應——分析頁面,得到想要的資料 (5)儲存文字——以txt格式儲存 使用環境 anaconda3 pyt

python爬蟲實戰-貓眼電影榜單top100

貓眼電影是靜態網頁,並且不需要驗證碼,非常適合爬蟲的入門練習,流程如下-通過url連接獲取html內容,在html中通過正則表示式,我們提取排名,名稱,主演,上映時間等資訊,格式如下["9", "魂斷藍橋", "主演:費雯·麗,羅伯特·泰勒,露塞爾·沃特森", "上映時間:1

python爬蟲例項豆瓣電影評分連結並圖示()-問題如何電影圖片(解決有程式碼)

這裡只有尾巴,來分析一下確定範圍:如何爬取圖片並下載?參考:http://blog.csdn.net/chaoren666/article/details/53488083----------------------------------------------------

python網路爬蟲例項:Requests+正則表示式貓眼電影TOP100

一、前言 最近在看崔慶才先生編寫的《Python3網路爬蟲開發實戰》這本書,學習了requests庫和正則表示式,爬取貓眼電影top100榜單是這本書的第一個例項,主要目的是要掌握requests庫和正則表示式在實際案例中的使用。 二、開發環境 執行平

python爬蟲實戰:利用pyquery貓眼電影TOP100榜單內容-2

上次利用pyquery爬取貓眼電影TOP100榜單內容的爬蟲程式碼中點選開啟連結 存在幾個不合理點。1. 第一個就是自定義的create_file(檔案存在判斷及建立)函式。我在後來的python檔案功能相關學習中,發現這個自定義函式屬於重複造輪子功能。因為 for data

20170513貓眼電影Top100

top compile bs4 etime http res XML n) quest import jsonimport reimport requestsfrom bs4 import BeautifulSoupfrom requests import RequestE

使用requests貓眼電影TOP100榜單

esp 進行 得到 ensure .com key d+ odin pickle   Requests是一個很方便的python網絡編程庫,用官方的話是“非轉基因,可以安全食用”。裏面封裝了很多的方法,避免了urllib/urllib2的繁瑣。   這一節使用request

python貓眼電影top100排行榜

技術 所有 結果 mys url with 地址 保存 pic 爬取貓眼電影TOP100(http://maoyan.com/board/4?offset=90)1). 爬取內容: 電影名稱,主演, 上映時間,圖片url地址保存到mariadb數據庫中;2). 所有的圖片保

用Requests和正則表示式貓眼電影(TOP100+最受期待榜)

目標站點分析 目標站點(貓眼榜單TOP100): 如下圖,貓眼電影的翻頁offset明顯在URL中,所以只要搞定第一頁的內容加上一個迴圈加上offset就可以爬取前100。 流程框架 1、抓取單頁內容 利用requests請求目標站點,得到單個網頁HTML程式碼,返回結

Python爬蟲網易、騰訊、新浪、搜狐新聞到本地

這個實驗主要爬取新聞網站首頁的新聞內容儲存到本地,爬取內容有標題、時間、來源、評論數和正文。 工具:python 3.6 谷歌瀏覽器 爬取過程: 一、安裝庫:urllib、requests、BeautifulSoup 1、urllib庫:Urlli

多種方法貓眼電影Top100排行榜,儲存到csv檔案,下載封面圖

參考連結:https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/83663400 因貓眼網站有些更新,參考連結中的部分程式碼執行報錯,特修改一下   #!/usr/bin/env python # -*- coding: utf-8

Python爬蟲京東商品使用者評論(分析+視覺化)

----------------------------------------------------------------------------------------------------------------------------- 1:在商品頁面f1