某网站热门影片资源爬取
程序员文章站
2022-05-09 15:06:44
...
爬取磁力链接以及部分字段,数据没有持久化 知识练手。
import re
import time
import requests
from lxml import etree
from urllib import parse
"""
提取电影天堂热映影片中的部分字段数据灭有神马意义就没保存这个部分
"""
class Dytt:
def __init__(self):
self.base_url = "http://www.dytt8.net/html/gndy/dyzz/"
self.start_url = "http://www.dytt8.net/html/gndy/dyzz/list_23_1.html"
self.headers= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)"
" Chrome/67.0.3396.62 Safari/537.36",
}
def parse_url(self,url):
"""
提高代码复用专门定义请求函数
response.text 推测出其编码方式然后解码成字符串(response.encoding=?进行指定)
response.content 返回二进制形式 可以指定解码方式变成字符串
response.apparent_encoding是指从内容中分析出的响应内容编码方式(回耗费些性能,在页面编码方式不统一时候进行使用)
"""
response = requests.get(url=url,headers = self.headers)
response.encoding = response.apparent_encoding
return response.text
def get_url_list(self,html):
"""
这个网页的翻页部分的secect包含了所有列表页的url地址 为了简化代码所以直接获取所有列表页的url
这里面的额url地址并不完整 所以用map函数进行补全
Python 2.x 返回列表。
Python 3.x 返回迭代器。
:param html:
:return: 回所有列表页的url地址
"""
html = etree.HTML(html)
list_page_url = html.xpath("//option/@value")[2:]
list_page_url = map(lambda x:parse.urljoin(self.base_url,x),list_page_url)
return list_page_url
def get_detail_url_list(self,html):
"""
:param html: 传过来的html字符串
:return: 每个列表页中提取出来的详情页的url地址
"""
html = etree.HTML(html)
detail_url_list = html.xpath("//div[@class='co_content8']/ul//@href")
detail_url_list = map(lambda x:parse.urljoin(self.base_url,x),detail_url_list)
return detail_url_list
def deal_detai_page(self,html):
html = etree.HTML(html)
item = {}
item["name"] = html.xpath("//h1//text()")[0]
item["image"] = html.xpath("//p/img/@src")
if item["image"]:
item["image"]=item["image"][0]
infom_elem = html.xpath("//div[@id='Zoom']")[0]
info_list = infom_elem.xpath(".//text()")
"""
首先获取影片详细信息的所有文本内容(为一个列表)
#形式一:字段名和其内同在一起◎类 别 科幻/恐怖
1.判断列表中的文本是否以这个字段名开头 或者 文本中是否包含这个字段名
2.如果为true则用正则替换 将字段名中的空白符替换成""
#形式二:字段名和其内容不在一起[例如简介,字段名和其内容在前后两个br标签]
1.首先获取该字段在列表中的下标索引=a[简介]然后通过列表[a+1]
2.进行正则替换
#形式三:字段名所对应的值分布在多行
1.获取字段名下的第一个值
2.获取这个字段的下标,构造一个循环range(字段名下标+1,列表长度)
3.通过字符串拼接的方式 将下一个下标的值拼接在一起,知道4.的条件出现
4.判断下一个字段名是否出现,出现的话循环停止
"""
for index,info in enumerate(info_list):
if "产 地" in info:
item["area"] = re.sub("◎产 地|\r|\t|\n",'',info)
if "类 别" in info:
item["type"] = re.sub("◎类 别|\r|\t|\n", '', info)
if "主 演" in info:
item["actor"] = re.sub("◎主 演|\r|\t|\n", '', info)
for i in range(index+1,len(info_list)):
item["actor"] += info_list[i]
if info_list[i].startswith("◎简 介 "):
break
item["actor"] = re.sub("\r|\t|\n",'',item["actor"])
if "◎简 介 " in info:
item["desc"] = info_list[index+1].strip()
print(item)
#影片的磁力链接
item=html.xpath("//a[contains(@href,'magnet')]/@href")[0]
return item
def run(self):
start_url = self.start_url
#请求首页
response = self.parse_url(start_url)
#解析首页 获取所有列表页的url
list_page_url = self.get_url_list(response)
#遍历列表页的url发送请求,获取详情页url地址列表
for url in list_page_url:
response = self.parse_url(url)
detail_url_list = self.get_detail_url_list(response)
#遍历详情页的list
for detail_url in detail_url_list:
#被反扒 设置等待时间
time.sleep(0.3)
response = self.parse_url(detail_url)
#提取信息返回item
item = self.deal_detai_page(response)
print(item)
if __name__ == '__main__':
"""
封装类,从run函数开始执行整个思维流程
"""
spider = Dytt()
spider.run()