当前位置: 首页 > 科技观察

Python爬虫爬取美剧网站

时间:2023-03-12 16:25:27 科技观察

一直以来都有看美剧的习惯,一方面练习英语听力,一方面打发时间。以前在视频网站上是可以在线观看的,但是自从广电总局的限购令之后,进口的美剧和英剧好像不再像以前那样同步更新了。不过,作为一个书呆子,追剧怎么可能不甘心呢,于是在网上搜索了一下,找到了一个可以用迅雷下载的美剧下载网站【天天美剧】。您可以随意下载各种资源。高清纪录片,大自然就是这么美。虽然找到了资源网站可以下载,但是每次都要打开浏览器,输入网址,找到美剧,点击链接下载。时间长了,感觉过程很繁琐,有时候网站链接打不开,会有点麻烦。一直在学习Python爬虫,所以今天心血来潮写了一个爬虫,抓取网站上所有的美剧链接,并保存在一个文本文件中。想要什么剧,直接打开迅雷的复制链接下载即可。其实一开始我是打算写那种发现一个url,用requests打开抓取下载链接,从首页抓取全站的。但是,有很多重复的链接,网站的url也没有我想的那么规整。写了半天,还是没有写出自己想要的那种发散爬虫。可能是我还没准备好,继续努力吧。..后来发现电视剧链接都在文章里面,而且文章的url后面有一个数字,像这样http://cn163.net/archives/24016/,于是就用了自己写的爬虫之前的经验,解决办法是自动生成url,后面的数字可以改,而且每部剧都是独一无二的,所以试试看看文章有多少,然后用range函数直接生成数字连续构造url。但是很多url是不存在的,所以会直接挂掉,不用担心,我们用的是requests,它自己的status_code是用来判断请求返回的状态的,所以只要返回的状态码是404,我们会跳过它,其他的都进去爬链接,这样就解决了url的问题。下面是上述步骤的实现代码。defget_urls(self):try:foriinrange(2015,25000):base_url='http://cn163.net/archives/'url=base_url+str(i)+'/'ifrequests.get(url).status_code==404:continueelse:self.save_links(url)exceptException,e:pass剩下的很顺利。在网上找了一个前辈写的类似的爬虫,但是只爬了一篇文章,所以借鉴了它的正则表达式。模式。我用的是BeautifulSoup,正则化效果不好,果断放弃,学无止境。但是效果并不是那么理想。大约一半的链接无法正确爬取,需要进一步优化。#-*-编码:utf-8-*-importrequestsimportreimportsysimportthreadingimporttimereload(sys)sys.setdefaultencoding('utf-8')classArchives(object):defsave_links(self,url):try:data=requests.get(url,timeout=3)content=data.textlink_pat='"(ed2k://\|file\|[^"]+?\.(S\d+)(E\d+)[^"]+?1024X\d{3}[^"]+?)"'name_pat=re.compile(r'(.*?)',re.S)links=set(re.findall(link_pat,content))name=re.findall(name_pat,content)links_dict={}count=len(links)exceptException,e:passforiinlinks:links_dict[int(i[1][1:3])*100+int(i[2][1:3])]=i#把剧集按s和e提取编号try:withopen(name[0].replace('/','')+'.txt','w')asf:printname[0]foriinsorted(list(links_dict.keys())):#季数+集合排序顺序写入f.write(links_dict[i][0]+'\n')print"Getlinks...",name[0],countexceptException,e:passdefget_urls(self):try:foriinrange(2015,25000):base_url='http://cn163.net/archives/'url=base_url+str(i)+'/'ifrequests.get(url).status_code==404:continueelse:self.save_links(url)exceptException,e:passdefmain(self):thread1=threading.Thread(target=self.get_urls())thread1.start()thread1.join()if__name__=='__main__':start=time.time()a=Archives()a.main()end=时间。10000多部剧,本以为爬完需要很长时间,结果爬取总时间不到20分钟,除了url错误和不匹配,让我想用Redis爬取在两个linux上,但是折腾了很多,觉得没必要,干脆就这么干吧,以后需要更多资料的时候再弄。过程中还有一个问题很折磨我,就是文件名的保存问题。我必须在这里抱怨。txt格式的文件名可以有空格,但是不能有斜线、反斜线、括号等,就是这个问题。我把整个上午的时间都花在了上面。一开始以为是抓取数据的错误。查了半天,才发现爬的剧名里面有个斜线,看得我好惨。向上。