目录[-]
简单的爬虫程序实践:爬取电影天堂二级页面中的磁力链接
#作者:冯桂和
#功能:爬取电影天堂二级页面中的磁力链接
#网址: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',
]