Python3+正則表達式爬取「電影天堂」四千多條片名、簡介、磁力連接

 需求


一、爬取連接:http://www.dytt8.net/
二、爬取內容:
    i、分類:-->mysql
        <a href="http://www.ygdy8.net/html/gndy/dyzz/index.html">最新影片</a></li><li>
        <a href="http://www.ygdy8.net/html/gndy/china/index.html">國內電影</a></li><li>
        <a href="http://www.ygdy8.net/html/gndy/oumei/index.html">歐美電影</a></li><li>
        <a href="http://www.dytt8.net/html/gndy/rihan/index.html">日韓電影</a></li><li>
    ii、發佈時間、片名、分類、簡介、連接
 html

import requests
import re
from lxml import etree

"""
創建爬蟲,返回爬取內容
輸入:
    url: 要爬取的連接
輸出:
    data: 抓取後的返回值
"""
def spider(url):
    kv = {'User-Agent': 'Mozilla/5.0'}
    response = requests.get(url, headers=kv)
    # 設置編碼
    response.encoding = "gbk"
    data = response.text
    return data

"""
獲取分類下總頁數
輸入: 
    data: 爬蟲spider抓取頁面後的返回值
輸出:
    int(pageRes): 總頁數
"""
def getPage(data):
    selector = etree.HTML(data)
    page = selector.xpath("//div[@class='x']")[1]
    # 輸出xpath下的全部內容 加‘?’指的是最小匹配
    pageRes = re.findall('共(.*?)頁', page.xpath('string(.)'))[0]
    return int(pageRes)


"""
獲取電影連接, 根據連接獲取全部跳轉連接與電影名
輸入:
    data: 爬蟲spider抓取頁面後的返回值
    links: 用來保存每一頁上電影的連接,list結構
輸出:
    無
"""
def saveLink(data, links):
    selector = etree.HTML(data)
    allLink = selector.xpath("//a[@class='ulink']")
    for link in allLink:
        name = re.findall('《(.*?)[》】]', link.xpath('./text()')[0])
        if len(name):
            link = ('http://www.ygdy8.net' + link.xpath('./@href')[0], name[0])
            links.insert(0, link)  # 頭插
            #print(link)

"""
根據電影連接獲取相關信息
輸入: 
    url: 頁面連接
輸出:
    time: 上映時間
    brief: 電影簡介
"""
def findDownURL(url):
    data = spider(url)
    selector = etree.HTML(data)
    # print(data[:1000])

    time = re.findall(r"(\d{4}-\d{1,2}-\d{1,2})", data)[0]
    # print(time)
    down = re.findall(r"magnet.*announce", data)
    # print(down)
    brief = re.findall(r"◎簡  介(.*)", data)[0].strip().split("◎")[0]  # 消除字符串先後空格,而後按◎分割,取前一部分(防止後面出現「◎獲獎」)
    # print(brief)
    dr = re.compile(r'(\u3000)|(【下載地址】)|(<[^>]+>)|(&.*?;)', re.S)  # 數據清洗
    brief = dr.sub("", brief)
    # print(brief)
    return time, brief, down

"""
輸出列表內容,而且獲取每一鏈接下的信息(包括下載地址和時間),而後制空列表
輸入:
    links: 用來保存每一頁上電影的連接,list結構
輸出:
    無
"""
def printList(links):
    sum = len(links)
    for i in range(sum):
        link = links.pop()
        print("    ", link, findDownURL(link[0]))

"""
獲取包含分頁下的全部連接
輸入:
    links: 用來保存每一頁上電影的連接,list結構
    url: 分類連接
輸出: 
    無
"""
def getAllURL(links, url):
    data = spider(url + "1.html")
    saveLink(data, links)
    page = getPage(data)
    print("第 1 頁爬取完成", url + "1.html")
    printList(links)
    # for i in range(2, 100):  # 爬取前十頁
    for i in range(2, page+1):  # list可能溢出, 採用變輸出邊清空
        data = spider(url + str(i) + ".html")
        saveLink(data, links)
        print("第", i, "頁爬取完成", url + str(i) + ".html")
        printList(links)
        # print(links)



links = []  #同一類型下全部電影的連接、片名
typeURL = "http://www.ygdy8.net/html/gndy/dyzz/list_23_"  # 注意並不是完整的url
getAllURL(links, typeURL)

運行結果:python

可能越日後爬,結果越難以預測,主要由於後面的頁面可能存在正則不一致問題。mysql

相關文章
相關標籤/搜索