最近发现有个电影下载网站叫做比特大雄,下了几部电影之后,打算写个爬虫把网站的电影信息都爬取下来。
一开始思路是这样的,从首页开始,解析首页的所有链接,如果这个链接是电影详情页的链接,就将其html
解析成想要的电影信息,如果不是电影详情页的链接,就将其加入到待爬取的URL list
里,等待后续继续从这个url
的页面爬取更多的链接。
爬虫代码Version 1
直接给出代码如下(含注释):
import requests
import re
import time
# 网站首页
base_url = r'https://www.btdx8.com/'
# 爬取到的新url会继续加入到这个list里
total_url_list = [base_url]
# 存放已经爬取过的url
used_url_list = []
# 存放是电影详情页的url
movie_url_list = []
# 从html文本中抓取url的正则表达式
url_reg = 'href="(https://.*?)"'
# 判断url是不是电影详情页url的正则表达式
movie_url_reg = 'https://www.btdx8.com/torrent/.*?html'
while 1:
# 取出url list中的第一个url
url = total_url_list.pop(0)
print('Current Url:', url)
print()
try:
# 获取url的html
text = requests.get(url).text
# 从html中找到所有的url链接
new_urls = re.findall(url_reg, text)
# 如果是之前没出现过的url,将其放入到total_url_list用于后续继续爬取
for n in new_urls:
if n not in total_url_list + used_url_list + movie_url_list:
total_url_list.append(n)
used_url_list.append(url)
# 如果当前url是电影详情页的链接,将其存入movie_url_list
if re.match(movie_url_reg, url):
movie_url_list.append(url)
print('Current url succeed')
time.sleep(0.1)
except:
print('Current url failed')
print('Total: %s, Used: %s, Movie: %s' % (len(total_url_list), len(used_url_list), len(movie_url_list)))
# 如果total_url_list已经为空了就停止循环
if len(total_url_list) == 0:
break
# 打印所有的movie url
print(movie_url_list)
这个代码肯定是有些问题的,比如total_url_list
可能永远都不为空,循环无法停止,不过可以先跑一跑看看情况。结果我就发现,速度太慢了!因为决定将其改成多线程爬虫,欢迎继续阅读后续的此系列文章。