当前位置:   article > 正文

基于python利用requests库获取dy2018下载信息,快捷获取最新电影_dy2018 镜像站

dy2018 镜像站

项目介绍

 

本项目是本人的课设,实用性很强,对于喜欢看电影的朋友来说可以快捷获取最新电影的下载信息(相关网址dy2018.com)

电影 / 最新电影_电影天堂-迅雷电影下载

环境搭建

python:3.10.0

request、lxml

步骤详解

依赖:

正则、requset、lxml

  1. import requests
  2. import re
  3. from lxml import etree

创建类并初始化:

请求地址为目标网站:

  1. class dy2018:
  2. def __init__(self):
  3. """初始化"""
  4. # 请求地址
  5. self.url = "https://www.dy2018.com/html/gndy/dyzz/index.html"
  6. # 请求头
  7. 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"}
  8. # 代理
  9. self.proxies = {"HTTP": "117.114.149.66:55443"}
'
运行

请求函数:

网站编码为GBK:

  1. def get_response(self, url):
  2. """发送请求并获取响应"""
  3. return requests.get(url=url, headers=self.header).content.decode("GBK")
'
运行

解析函数:

在第一级页面用xpath定位每条电影链接:

 获取的地址不能直接用,可以点击任意两个链接查看它们的特征:

 

 

 得出结论,下一级网址 = dy2018.com/ + href元素的地址,

调用请求函数,得到html信息,调用打印函数。

  1. def parse_list_data(self, html):
  2. """解析数据"""
  3. # 1.创建查找对象
  4. html_node = etree.HTML(html)
  5. # 2. 查找父节点div
  6. div_node = html_node.xpath('//div[@class="co_content8"]/ul')[0]
  7. # 3. 查找table节点
  8. all_table_nodes = div_node.xpath('//table[@class="tbspan"]')
  9. # 4. 遍历每一个table节点
  10. for table_node in all_table_nodes:
  11. # 地址前缀
  12. base_url = "https://www.dy2018.com"
  13. # 取后缀地址
  14. path = table_node.xpath(".//tr[2]//b/a/@href")[0]
  15. # 连接地址前缀和后缀
  16. movie_detail_url = base_url + path
  17. # 发送详情页请求
  18. movie_detail_html = self.get_response(movie_detail_url)
  19. # print(movie_detail_html)
  20. self.print_list_data(movie_detail_html)
'
运行

打印函数:

定义正则:

通过观察特征可以看出电影信息前缀都有一个固定的字符串:

◎译  名

◎片  名

◎年  代

...

最后,最重要的是电影的下载链接:

观察这个链接的特征,

发现这个链接是以“magnet:\?xt=urn:btih:”开头的,但是确获取了多个值,有的链接是无法下载的,为了准确获取的值,我们直接在html中找出特征:

我们发现有效链接是以a href=为开头,&tr为结尾的,根据这个特征定义正则: 

r'a href="(magnet:\?xt=urn:btih:.*?)&tr='

根据正则去匹配信息,

打印电影信息。

  1. def print_list_data(self, page_data):
  2. """打印数据"""
  3. # 定义正则表达式模式
  4. patterns = {
  5. "译名": r"◎译\s* \s*名\s+(.*?)<br />",
  6. "片名": r"◎片\s* \s*名\s+(.*?)<br />",
  7. "年代": r"◎年\s* \s*代\s+(.*?)<br />",
  8. "产地": r"◎产\s* \s*地\s+(.*?)<br />",
  9. "类别": r"◎类\s* \s*别\s+(.*?)<br />",
  10. "语言": r"◎语\s* \s*言\s+(.*?)<br />",
  11. "上映日期": r"◎上映日期\s+(.*?)<br />",
  12. "豆瓣评分": r"◎豆瓣评分\s+(.*?)<br />",
  13. "torrent": r'a href="(magnet:\?xt=urn:btih:.*?)&tr=',
  14. }
  15. # 初始化一个字典来存储提取的信息
  16. movie_data = {}
  17. # 使用正则表达式提取信息
  18. for key, pattern in patterns.items():
  19. match = re.search(pattern, page_data)
  20. if match:
  21. movie_data[key] = match.group(1)
  22. # 打印提取的电影信息
  23. print("译名:", movie_data.get("译名"))
  24. print("片名:", movie_data.get("片名"))
  25. print("年代:", movie_data.get("年代"))
  26. print("产地:", movie_data.get("产地"))
  27. print("类别:", movie_data.get("类别"))
  28. print("语言:", movie_data.get("语言"))
  29. print("上映日期:", movie_data.get("上映日期"))
  30. print("豆瓣评分:", movie_data.get("豆瓣评分"))
  31. print("torrent:", movie_data.get("torrent"))
  32. print("--------------------------------")
'
运行

运行函数:

传递参数为页数,但是这个网站第一页和第二页没有统一特征:

https://www.dy2018.com/html/gndy/dyzz/index.html

https://www.dy2018.com/html/gndy/dyzz/index_2.html

这是第一页和第二页的url

可以看出第一页index后面不带“_”第二页带,没办法,获取第二页、第三页信息时只能重新写一个统一的url,将变量index传递进去。

  1. def run_spider(self, page_index=1):
  2. # 请求地址
  3. url = self.url
  4. # 发送请求
  5. pageHtml = self.get_response(url)
  6. # 解析数据
  7. self.parse_list_data(pageHtml)
  8. if page_index > 1:
  9. for index in range(2, page_index + 1):
  10. base_index_url = f"https://www.dy2018.com/html/gndy/dyzz/index_{index}.html"
  11. # 发送请求
  12. pageHtml = self.get_response(base_index_url)
  13. # 解析数据
  14. self.parse_list_data(pageHtml)
'
运行

运行结果: 

最后打开迅雷,将复制的链接在迅雷中打开,就可以下载电影了

源代码

放出源代码

  1. import requests
  2. import re
  3. from lxml import etree
  4. class dy2018:
  5. def __init__(self):
  6. """初始化"""
  7. # 请求地址
  8. self.url = "https://www.dy2018.com/html/gndy/dyzz/index.html"
  9. # 请求头
  10. 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"}
  11. # 代理
  12. self.proxies = {"HTTP": "117.114.149.66:55443"}
  13. def get_response(self, url):
  14. """发送请求并获取响应"""
  15. return requests.get(url=url, headers=self.header).content.decode("GBK")
  16. def print_list_data(self, page_data):
  17. """打印数据"""
  18. # 定义正则表达式模式
  19. patterns = {
  20. "译名": r"◎译\s* \s*名\s+(.*?)<br />",
  21. "片名": r"◎片\s* \s*名\s+(.*?)<br />",
  22. "年代": r"◎年\s* \s*代\s+(.*?)<br />",
  23. "产地": r"◎产\s* \s*地\s+(.*?)<br />",
  24. "类别": r"◎类\s* \s*别\s+(.*?)<br />",
  25. "语言": r"◎语\s* \s*言\s+(.*?)<br />",
  26. "上映日期": r"◎上映日期\s+(.*?)<br />",
  27. "豆瓣评分": r"◎豆瓣评分\s+(.*?)<br />",
  28. "torrent": r'a href="(magnet:\?xt=urn:btih:.*?)&tr=',
  29. }
  30. # 初始化一个字典来存储提取的信息
  31. movie_data = {}
  32. # 使用正则表达式提取信息
  33. for key, pattern in patterns.items():
  34. match = re.search(pattern, page_data)
  35. if match:
  36. movie_data[key] = match.group(1)
  37. # 打印提取的电影信息
  38. print("译名:", movie_data.get("译名"))
  39. print("片名:", movie_data.get("片名"))
  40. print("年代:", movie_data.get("年代"))
  41. print("产地:", movie_data.get("产地"))
  42. print("类别:", movie_data.get("类别"))
  43. print("语言:", movie_data.get("语言"))
  44. print("上映日期:", movie_data.get("上映日期"))
  45. print("豆瓣评分:", movie_data.get("豆瓣评分"))
  46. print("torrent:", movie_data.get("torrent"))
  47. print("--------------------------------")
  48. def parse_list_data(self, html):
  49. """解析数据"""
  50. # 1.创建查找对象
  51. html_node = etree.HTML(html)
  52. # 2. 查找父节点div
  53. div_node = html_node.xpath('//div[@class="co_content8"]/ul')[0]
  54. # 3. 查找table节点
  55. all_table_nodes = div_node.xpath('//table[@class="tbspan"]')
  56. # 4. 遍历每一个table节点
  57. for table_node in all_table_nodes:
  58. # 地址前缀
  59. base_url = "https://www.dy2018.com"
  60. # 取后缀地址
  61. path = table_node.xpath(".//tr[2]//b/a/@href")[0]
  62. # 连接地址前缀和后缀
  63. movie_detail_url = base_url + path
  64. # 发送详情页请求
  65. movie_detail_html = self.get_response(movie_detail_url)
  66. # print(movie_detail_html)
  67. self.print_list_data(movie_detail_html)
  68. def run_spider(self, page_index=1):
  69. # 请求地址
  70. url = self.url
  71. # 发送请求
  72. pageHtml = self.get_response(url)
  73. # 解析数据
  74. self.parse_list_data(pageHtml)
  75. if page_index > 1:
  76. for index in range(2, page_index + 1):
  77. base_index_url = f"https://www.dy2018.com/html/gndy/dyzz/index_{index}.html"
  78. # 发送请求
  79. pageHtml = self.get_response(base_index_url)
  80. # 解析数据
  81. self.parse_list_data(pageHtml)
  82. if __name__ == '__main__':
  83. dy2018().run_spider(page_index=1)

第一次做博客,有不足的地方,还望各位海涵。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/946936
推荐阅读
相关标签
  

闽ICP备14008679号