赞
踩
本项目是本人的课设,实用性很强,对于喜欢看电影的朋友来说可以快捷获取最新电影的下载信息(相关网址dy2018.com)
python:3.10.0
request、lxml
正则、requset、lxml
- import requests
- import re
- from lxml import etree
请求地址为目标网站:
- class dy2018:
- def __init__(self):
- """初始化"""
- # 请求地址
- self.url = "https://www.dy2018.com/html/gndy/dyzz/index.html"
- # 请求头
- self.header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
- # 代理
- self.proxies = {"HTTP": "117.114.149.66:55443"}
'运行
网站编码为GBK:
- def get_response(self, url):
- """发送请求并获取响应"""
- return requests.get(url=url, headers=self.header).content.decode("GBK")
'运行
在第一级页面用xpath定位每条电影链接:
获取的地址不能直接用,可以点击任意两个链接查看它们的特征:
得出结论,下一级网址 = dy2018.com/ + href元素的地址,
调用请求函数,得到html信息,调用打印函数。
- def parse_list_data(self, html):
- """解析数据"""
- # 1.创建查找对象
- html_node = etree.HTML(html)
- # 2. 查找父节点div
- div_node = html_node.xpath('//div[@class="co_content8"]/ul')[0]
- # 3. 查找table节点
- all_table_nodes = div_node.xpath('//table[@class="tbspan"]')
- # 4. 遍历每一个table节点
- for table_node in all_table_nodes:
- # 地址前缀
- base_url = "https://www.dy2018.com"
- # 取后缀地址
- path = table_node.xpath(".//tr[2]//b/a/@href")[0]
- # 连接地址前缀和后缀
- movie_detail_url = base_url + path
- # 发送详情页请求
- movie_detail_html = self.get_response(movie_detail_url)
-
- # print(movie_detail_html)
-
- self.print_list_data(movie_detail_html)
'运行
定义正则:
通过观察特征可以看出电影信息前缀都有一个固定的字符串:
◎译 名
◎片 名
◎年 代
...
最后,最重要的是电影的下载链接:
观察这个链接的特征,
发现这个链接是以“magnet:\?xt=urn:btih:”开头的,但是确获取了多个值,有的链接是无法下载的,为了准确获取的值,我们直接在html中找出特征:
我们发现有效链接是以a href=为开头,&tr为结尾的,根据这个特征定义正则:
r'a href="(magnet:\?xt=urn:btih:.*?)&tr='
根据正则去匹配信息,
打印电影信息。
- def print_list_data(self, page_data):
- """打印数据"""
- # 定义正则表达式模式
- patterns = {
- "译名": r"◎译\s* \s*名\s+(.*?)<br />",
- "片名": r"◎片\s* \s*名\s+(.*?)<br />",
- "年代": r"◎年\s* \s*代\s+(.*?)<br />",
- "产地": r"◎产\s* \s*地\s+(.*?)<br />",
- "类别": r"◎类\s* \s*别\s+(.*?)<br />",
- "语言": r"◎语\s* \s*言\s+(.*?)<br />",
- "上映日期": r"◎上映日期\s+(.*?)<br />",
- "豆瓣评分": r"◎豆瓣评分\s+(.*?)<br />",
- "torrent": r'a href="(magnet:\?xt=urn:btih:.*?)&tr=',
- }
-
- # 初始化一个字典来存储提取的信息
- movie_data = {}
-
- # 使用正则表达式提取信息
- for key, pattern in patterns.items():
- match = re.search(pattern, page_data)
- if match:
- movie_data[key] = match.group(1)
-
- # 打印提取的电影信息
- print("译名:", movie_data.get("译名"))
- print("片名:", movie_data.get("片名"))
- print("年代:", movie_data.get("年代"))
- print("产地:", movie_data.get("产地"))
- print("类别:", movie_data.get("类别"))
- print("语言:", movie_data.get("语言"))
- print("上映日期:", movie_data.get("上映日期"))
- print("豆瓣评分:", movie_data.get("豆瓣评分"))
- print("torrent:", movie_data.get("torrent"))
- print("--------------------------------")
'运行
传递参数为页数,但是这个网站第一页和第二页没有统一特征:
https://www.dy2018.com/html/gndy/dyzz/index.html
https://www.dy2018.com/html/gndy/dyzz/index_2.html
这是第一页和第二页的url
可以看出第一页index后面不带“_”第二页带,没办法,获取第二页、第三页信息时只能重新写一个统一的url,将变量index传递进去。
- def run_spider(self, page_index=1):
- # 请求地址
- url = self.url
- # 发送请求
- pageHtml = self.get_response(url)
- # 解析数据
- self.parse_list_data(pageHtml)
-
- if page_index > 1:
- for index in range(2, page_index + 1):
- base_index_url = f"https://www.dy2018.com/html/gndy/dyzz/index_{index}.html"
- # 发送请求
- pageHtml = self.get_response(base_index_url)
- # 解析数据
- self.parse_list_data(pageHtml)
'运行
最后打开迅雷,将复制的链接在迅雷中打开,就可以下载电影了
放出源代码
- import requests
- import re
- from lxml import etree
-
- class dy2018:
- def __init__(self):
- """初始化"""
- # 请求地址
- self.url = "https://www.dy2018.com/html/gndy/dyzz/index.html"
- # 请求头
- self.header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"}
- # 代理
- self.proxies = {"HTTP": "117.114.149.66:55443"}
-
- def get_response(self, url):
- """发送请求并获取响应"""
- return requests.get(url=url, headers=self.header).content.decode("GBK")
-
- def print_list_data(self, page_data):
- """打印数据"""
- # 定义正则表达式模式
- patterns = {
- "译名": r"◎译\s* \s*名\s+(.*?)<br />",
- "片名": r"◎片\s* \s*名\s+(.*?)<br />",
- "年代": r"◎年\s* \s*代\s+(.*?)<br />",
- "产地": r"◎产\s* \s*地\s+(.*?)<br />",
- "类别": r"◎类\s* \s*别\s+(.*?)<br />",
- "语言": r"◎语\s* \s*言\s+(.*?)<br />",
- "上映日期": r"◎上映日期\s+(.*?)<br />",
- "豆瓣评分": r"◎豆瓣评分\s+(.*?)<br />",
- "torrent": r'a href="(magnet:\?xt=urn:btih:.*?)&tr=',
- }
-
- # 初始化一个字典来存储提取的信息
- movie_data = {}
-
- # 使用正则表达式提取信息
- for key, pattern in patterns.items():
- match = re.search(pattern, page_data)
- if match:
- movie_data[key] = match.group(1)
-
- # 打印提取的电影信息
- print("译名:", movie_data.get("译名"))
- print("片名:", movie_data.get("片名"))
- print("年代:", movie_data.get("年代"))
- print("产地:", movie_data.get("产地"))
- print("类别:", movie_data.get("类别"))
- print("语言:", movie_data.get("语言"))
- print("上映日期:", movie_data.get("上映日期"))
- print("豆瓣评分:", movie_data.get("豆瓣评分"))
- print("torrent:", movie_data.get("torrent"))
- print("--------------------------------")
-
-
- def parse_list_data(self, html):
- """解析数据"""
- # 1.创建查找对象
- html_node = etree.HTML(html)
- # 2. 查找父节点div
- div_node = html_node.xpath('//div[@class="co_content8"]/ul')[0]
- # 3. 查找table节点
- all_table_nodes = div_node.xpath('//table[@class="tbspan"]')
- # 4. 遍历每一个table节点
- for table_node in all_table_nodes:
- # 地址前缀
- base_url = "https://www.dy2018.com"
- # 取后缀地址
- path = table_node.xpath(".//tr[2]//b/a/@href")[0]
- # 连接地址前缀和后缀
- movie_detail_url = base_url + path
- # 发送详情页请求
- movie_detail_html = self.get_response(movie_detail_url)
-
- # print(movie_detail_html)
-
- self.print_list_data(movie_detail_html)
-
- def run_spider(self, page_index=1):
- # 请求地址
- url = self.url
- # 发送请求
- pageHtml = self.get_response(url)
- # 解析数据
- self.parse_list_data(pageHtml)
-
- if page_index > 1:
- for index in range(2, page_index + 1):
- base_index_url = f"https://www.dy2018.com/html/gndy/dyzz/index_{index}.html"
- # 发送请求
- pageHtml = self.get_response(base_index_url)
- # 解析数据
- self.parse_list_data(pageHtml)
-
-
- if __name__ == '__main__':
- dy2018().run_spider(page_index=1)
第一次做博客,有不足的地方,还望各位海涵。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。