今天的作业,爬取是一些电影数据。也是遇到了一些问题,搞了一上午,真是把我气坏了)
问题描述:
弄出来的数据总是出来一半之后就开始报错,和我作死。
原因是之前在提取子页面这部分我使用的是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