目录[-]

简单的爬虫程序实践:爬取电影天堂二级页面中的磁力链接

#作者:冯桂和
#功能:爬取电影天堂二级页面中的磁力链接
#网址:https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
#保存:将爬取的数据保存至MovieSky.csv

from urllib import request
import re
import time
import random
import csv
from ua_info import ua_list
import pandas as pd

#声明一个空白二维数组
df=pd.DataFrame()
#声明空白列表全局变量,存取二级页面后缀数据及电影名称
lista1=[]
#声明空白列表全局变量,存取二级页面内的磁力链接
lista2=[]

class MovieSkySpider(object): 
    #初始化
    #定义初始页面url
    def __init__(self):
        self.url = "https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html"   #一级页面
        self.url2="https://www.dytt8.net/html/gndy/dyzz/{}"                 #二级页面
    #请求一级界面函数
    def get_html_1(self,url):
        headers = {'User-Agent':random.choice(ua_list)} #随机用户请求头
        req = request.Request(url=url,headers=headers)  #创建请求对应
        res = request.urlopen(req)                      #获取响应对象
        html = res.read().decode('gb2312', 'ignore')    #获取响应内容
        self.parse_html_1(html)                 #调用解析函数
    #解析一级界面函数
    def parse_html_1(self,html):
        #正则表达式
        re_bds = r'<a href="/html/gndy/dyzz/(.*?)" class="ulink">.*?《(.*?)》'
        #生成正则表达式对象
        pattern = re.compile(re_bds,re.S)
        #列表元组
        r_list1=pattern.findall(html)
        self.save_html_1(r_list1)               #调用保存函数 
        for r in r_list1:                       #调用二级解析
            one=r[0]#二级页面后缀
            url2=self.url2.format(one)
            self.get_html_2(url2)
            print("磁力抓取成功:{}".format(r[1]))
            time.sleep(random.uniform(1,2))
    #一级界面数据保存至列表lista1
    def save_html_1(self,r_list1):
        global lista1
        lista1+=r_list1
    #请求二级界面函数
    def get_html_2(self,url):
        headers = {'User-Agent':random.choice(ua_list)} #随机用户请求头
        req = request.Request(url=url,headers=headers)  #创建请求对应
        res = request.urlopen(req)                      #获取响应对象
        html = res.read().decode('gb2312', 'ignore')    #获取响应内容
        self.parse_html_2(html)                 #调用解析函数
    #解析二级界面函数
    def parse_html_2(self,html):
        #正则表达式
        re_bds = r'blank" href="(.*?)"><strong'
        #生成正则表达式对象
        pattern = re.compile(re_bds,re.S)
        #列表元组
        r_list2=pattern.findall(html)
        self.save_html_2(r_list2)                   #调用保存函数 
    #二级界面数据保存至列表lista2
    def save_html_2(self,r_list2):
        global lista2
        lista2+=r_list2

    #主函数
    def run(self):
        #抓取每一页数据,共2页
        for offset in range(1,3):               #生成1~2序列
            url = self.url.format(offset)   #分页url拼接
            self.get_html_1(url)                #url参数导入get_html函数
            #生成1-2之间的浮点数
            time.sleep(random.uniform(1,2))
            print("第{}页抓取完毕".format(offset))

if __name__ == '__main__':
    spider =MovieSkySpider()
    spider.run()
    df1=pd.DataFrame(lista1,columns=['二级页面后缀','电影名字'])
    df2=pd.DataFrame(lista2,columns=['磁力链接'])
    df=df1.join(df2)
    df.to_csv('MovieSky.csv')
    print("——————抓取程序结束——————")

用户池

#User Agent用户池

ua_list = [
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
]