爬虫(2)-电影天堂2022精品电影

1.爬取2022精品电影名和下载链接(种子)

# -*- coding: utf-8 -*-
"""
@Time    :  2022/3/18 17:21
@Author  : Andrew
@File    : 电影天堂.py
"""
import csv
import requests
import re
"""
    1.第一步还是先定位目标2022新片所在weizhi1
    2.从中提取到子页面的链接地址
    3.请求该链接地址,拿到我们的下载链接
    4.查看返回的网页源代码时,发现乱码,
        由于request.get()后会自动进行一次utf-8解码,
        但这只对用utf-8编码的网页有效,因此需要查看源
        代码中meta标签的charset检查源代码的编码格式
    5.在设计正则表达式时,要注意:
        不能有多余的空格;
        注意看原来的代码里的引号结构,定位的源代码属性值是用'',那么在就r"",反之r''
    6.提取页面的子链接,就找它的跳转url,a标签就找href
    7.关于finditer的返回值迭代器:
        it里面:
            match为匹配的字符串,通过it.group("name")获取,(?P<name>.*?)
            span为该字符串从始末位置,是个元组,通过it.span()获取
        it.groupdict()将会把it.group("name")的值和“name”组成字典
    8.面对爬取到的页面,当作字符串处理就行了,不用考虑html结构上的问题,
        截取哪里就从哪里开始,哪里结束就到哪里,哪怕取到问号呢,不要受到干扰
        比如下面代码中取href时,取出从href="到"的内容: r'href="(?P<url>.*?)"'
"""


# 创建文件 ,utf-8保证不乱码,newline=""防止excel打开csv时有多余空行
f = open("data_movie.csv", mode="w", encoding="utf-8", newline="")
csvWriter = csv.writer(f)
title = {'title': "电影名字", 'download': "下载链接"}
csvWriter.writerow(title.values())  # 写入标题
# 电影天堂的主页
domain = "https://m.dytt8.net/index2.htm"
# header
resp = requests.get(domain, verify=False)  # verify = False 取消安全验证
resp.encoding = 'gb2312'
# print(resp.text)
content1 = resp.text
# 预定义正则
obj1 = re.compile(r'2022新片精品.*?手机浏览,推荐下载本站app,绿色小巧,简单实用!详情请点击!.*?</tr>(?P<table>.*?)</table>', re.S)
obj2 = re.compile(r"最新电影下载</a>]<a href='(?P<href>.*?)'>", re.S)
obj3 = re.compile(r'◎译  名(?P<movieName>.*?)<br />.*?<a target="_blank" href="(?P<downLoad>.*?)"', re.S)
result1 = obj1.finditer(content1)
childDomainList = []
for it in result1:
    # 提取子页面的url
    content2 = it.group('table')
    result2 = obj2.finditer(content2)
    for itt in result2:
        # itt:  最新电影下载</a>]<a href='(?P<href>.*?)'> 匹配到的一条信息
        child_domain = domain.replace("/index2.htm", "") + itt.group('href')
        childDomainList.append(child_domain)
# 提取子页面
for href in childDomainList:
    respChild = requests.get(href, verify=False)
    respChild.encoding = 'gb2312'
    content3 = respChild.text
    result3 = obj3.finditer(content3)
    for i in result3:
        print(i.group('movieName'))
        print(i.group('downLoad'))
        dic = i.groupdict()
        csvWriter.writerow(dic.values())
resp.close()

 

 2.beautifulsoup2022精品电影名和子链接

# -*- coding: utf-8 -*-
"""
@Time    :  2022/3/19 14:15
@Author  : Andrew
@File    : bs4解析.py
"""
import csv
import re

import requests
from bs4 import BeautifulSoup

"""
    bs4基于html(hyper text market language)的标签和属性来进行解析的
    <标签 属性=属性值>内容</标签>
"""
# 创建文件 ,utf-8保证不乱码,newline=""防止excel打开csv时有多余空行
f = open("movieName.csv", mode="w", encoding="utf-8", newline="")
csvWriter = csv.writer(f)
title = {'movieName': "电影名字", 'childurl': "子链接"}
csvWriter.writerow(title.values())  # 写入标题
# 安装 pip install bs4
url = "https://m.dytt8.net/index2.htm"
resp = requests.get(url)
resp.encoding = "gb2312"
# print(resp.text)
# 解析数据
# 1.把页面源代码交给BeauifulSoup进行处理,生成bs4对象
page = BeautifulSoup(resp.text, "html.parser")  # 告诉BeautifulSoup,resp.text就是html,指定html解析器

# 2.从bs对象中取数据
# find(标签,属性 = 属性值) 找到一个满足条件的标签就返回
# find_all(标签,属性 = 属性值) 找到所有的满足条件的标签返回

# table = page.find("table", class_="co_content8")  # class_对应标签属性class
table = page.find("table", attrs={"border": "0", "cellpadding": "0", "cellspacing": "0", "width": "100%"})  # 这个也可以
# print(table)
# 找所有的tr,并从第2个tr开始,即就是去掉第一个游戏app杂物
trs = table.find_all('tr')[1:]
obj = re.compile(r'href="(?P<href>.*?)"', re.S)
for tr in trs:
    # 找出每个tr中所有的td,并将从第二个a开始存,因为源代码中,第一个a是最新电影下载,不是我们要的
    td = tr.find_all("td", attrs={"width": "85%", "height": "22", "class": "inddline"})
    a = td[0].find_all("a")[1:]
    # print(str(a[0]))
    result = obj.finditer(str(a[0]))
    # 子链接
    childurl = ""
    for it in result:
        childurl = url.replace("/index2.htm", "") + it.group("href")
    movies = {"movieName": a[0].text, "childurl": childurl}
    csvWriter.writerow(movies.values())
f.close()
resp.close()

 

posted @ 2022-03-19 12:20  乔十六  阅读(34366)  评论(0编辑  收藏  举报