2021-08-08

今天的作业,爬取是一些电影数据。也是遇到了一些问题,搞了一上午,真是把我气坏了)
问题描述:
弄出来的在这里插入图片描述
弄出来的数据总是出来一半之后就开始报错,和我作死。
原因是之前在提取子页面这部分我使用的是result3=obj3.search()
在后期有一个页面自身不包含我匹配的信息,在那就自动报错了。所以后来我改成result3=obj3.finditer(),自动跳过那个页面。就顺利全爬出来
在这里插入图片描述

#1.定位到2021必看热片
#2.从2021必看热片中提取到子页面的链接下载地址
#3.请求子页面的链接地址。拿到我们想要的下载地址

import requests
import re
domain='https://www.dytt89.com/'
resp=requests.get(domain)
resp.encoding='gb2312'#指定字符集
#print(resp.text)


#拿到ul里边的li
obj1=re.compile(r"2021必看热片.*?<ul>(?P<liebiao>.*?)</ul>",re.S)
obj2=re.compile(r"<a href='(?P<href>.*?)'", re.S)
obj3=re.compile(r'◎片  名(?P<movie>.*?)<br />.*?<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)">',re.S)

#<td style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="magnet:?xt=urn:btih:35c6652f69d73ae69d918cc9def27d7e83d239eb&dn=[电影天堂www.dytt89.com]哆啦A梦:伴我同行2-2021_BD国粤日三语中字.mp4&tr=http://t.t789.me:2710/announce&tr=http://t.t789.co:2710/announce&tr=http://t.t789.vip:2710/announce">magnet:?xt=urn:btih:35c6652f69d73ae69d918cc9def27d7e83d239eb&dn=[电影天堂www.dytt89.com]哆啦A梦:伴我同行2-2021_BD国粤日三语中字.mp4</a></td>
result1=obj1.finditer(resp.text)
child_href_list=[]
for it in result1:
    ul=it.group('liebiao')
    #print(ul)

    #提取子页面链接
    result2=obj2.finditer(ul)
    for itt in result2:
        #拼接子页面的url地址:域名+子页面地址
        child_href=domain+itt.group('href').strip("/")
        child_href_list.append(child_href)#把子页面链接保存起来

#提取子页面内容
for href in child_href_list:
    response=requests.get(href)
    response.encoding='gb2312'
    #print(response.text)
    result3=obj3.finditer(response.text)
    for ittt in result3:
        movie=ittt.group("movie")
        print(movie)
        download=ittt.group("download")
        print(download)

现在说一下匹配的几种类型以及不同之处:
1、match

re.match(pattern, string[, flags])

从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。

2、search

re.search(pattern, string[, flags])

若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。

3、findall

re.findall(pattern, string[, flags])

返回string中所有与pattern相匹配的全部字串,返回形式为数组。

4、finditer

re.finditer(pattern, string[, flags])

返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。

若匹配成功,match()/search()返回的是Match对象,finditer()返回的也是Match对象的迭代器,获取匹配结果需要调用Match对象的group()、groups或group(index)方法。
方法search(),它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。也就是说,正则表达式可以是字符串的一部分,在匹配时,search()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜索完了还没有找到,就返回None。
参考文献:
【1】https://blog.csdn.net/weixin_39553705/article/details/110784388
【2】https://blog.csdn.net/chengqiuming/article/details/86361162

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值