坐火车的时候没事干改进了以前的代码,将主页和下载链接爬取失败的记录并在最后重新爬取,代码写得乱乱的,将就看吧,能用就行~
使用爬虫爬取的电影天堂的资源,可在最后方下载Excel表格使用。
代码如下:
import requests from bs4 import BeautifulSoup import re import time faillist=[] mainfailllist=[] def getHTMLText(url): try: r=requests.get(url,timeout=30) r.raise_for_status() r.encoding='gb2312' #电影天堂的编码 return r.text except: return "" def getEverySite(ilist,html): soup=BeautifulSoup(html,'html.parser') content=soup.find_all('b') #先找到b标签 HTML=str(content) #将内容转换为str links=BeautifulSoup(HTML,'html.parser') #重新熬一锅汤 for link in links.find_all('a'): #找到a标签 url="http://www.dytt8.net"+link.get('href') #加上完整的url name=link.text ilist.append([name,url]) def printGoodsList(ilist): f = open('MovieData.csv','a',encoding='gb2312') tplt="{0:{3}<32}\t\t{1:<16}\t\t\t{2:<16}" alllist=[] for g in ilist: alllist.append([g[0],g[1],getDownload(g[1])]) #添加alllist的内容 if alllist[0][2]=="未获取到下载链接": faillist.append([g[0],g[1]]) #所有未获取到下载链接的加入faillist最后重新爬取 pass print(tplt.format(alllist[0][0],alllist[0][1],alllist[0][2],chr(12288))) try: f.write('{},{},{}\n'.format(str(alllist[0][0]),str(alllist[0][1]),str(alllist[0][2]))) #有时会产生编码错误 except: pass del alllist[0:2] #删除alllist的内容 f.close() def getDownload(url): links=getHTMLText(url) for k in range(4): #若爬取失败则多次爬取 if links=="": print("第"+str(k+1)+"次爬取失败,正在重新爬取") links=getHTMLText(url) if links=="": print("无法爬取下载链接") return "未获取到下载链接" soup=BeautifulSoup(links,'html.parser') ftp="".join(soup.find_all(text=re.compile('^ftp'))) if ftp=="": return "该链接是磁力链接,暂不支持" return ftp #匹配正文以ftp开头的字段,列表转化为str def main(): print("******************欢迎使用电影天堂定向爬虫******************") print("***声明:电影天堂并未禁止此爬虫爬取的页面,该爬虫是合法的***") print("************************Made By King************************") depth=input("输入要爬取页面的深度:") depth=int(depth)+1 f = open('MovieData.csv','a',encoding='gb2312') f.write('{},{},{}\n'.format('电影名','网址','下载地址')) f.close() print("{0:{3}<32}\t\t{1:<16}\t\t\t{2:<16}".format("电影名","网址\t\t\t\t\t","下载地址",chr(12288))) for i in range(1,depth): try: infoList=[] if i==1: url="http://www.dytt8.net/html/gndy/dyzz/index.html" else: url="http://www.dytt8.net/html/gndy/dyzz/list_23_"+str(i)+".html" html=getHTMLText(url) for j in range(5): #若爬取失败则多次爬取 if html=="": html=getHTMLText(url) if html=="": mainfaillist.appen(url) #将未爬取成功的主页面记录,最后在爬取试一下 getEverySite(infoList,html) printGoodsList(infoList) print("爬虫已经爬取了第"+str(i)+"个页面") except: pass #重新爬取失败主页 print("下面开始尝试再次爬取未爬取成功的主页") for i in mainfailllist: infoList=[] html=getHTMLText(i) for j in range(5): #若爬取失败则多次爬取 if html=="": html=getHTMLText(i) if html=="": print("依旧爬取失败,建议手动访问"+str(i)+" 查看") getEverySite(infoList,html) printGoodsList(infoList) print(str(i)+" 爬取成功,已将其中的网页加入文件中") #重新爬取单个下载链接 print("下面开始尝试再次爬取未获取到下载链接的网页") printGoodsList(faillist) print("爬取完成——King") infoList.clear() faillist.clear() mainfailllist.clear() main()
资源:
一条评论 “Python爬取电影天堂”
你为何如此优秀