从0开始写一个多线程爬虫(1)

最近发现有个电影下载网站叫做比特大雄,下了几部电影之后,打算写个爬虫把网站的电影信息都爬取下来。

一开始思路是这样的,从首页开始,解析首页的所有链接,如果这个链接是电影详情页的链接,就将其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可能永远都不为空,循环无法停止,不过可以先跑一跑看看情况。结果我就发现,速度太慢了!因为决定将其改成多线程爬虫,欢迎继续阅读后续的此系列文章。

    原文作者:Harpsichord1207
    原文地址: https://segmentfault.com/a/1190000016112598
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞