资讯专栏INFORMATION COLUMN

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

imccl / 1414人阅读

摘要:最近发现有个电影下载网站叫做比特大雄,下了几部电影之后,打算写个爬虫把网站的电影信息都爬取下来。结果我就发现,速度太慢了因为决定将其改成多线程爬虫,欢迎继续阅读后续的此系列文章。

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


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42298.html

相关文章

  • 0开始一个线程爬虫(2)

    摘要:继续看上一段循环的代码,是遍历,将已经挂了的线程去除掉,那么在这个中线程什么情况下会死掉就是类中的方法中的这段代码如果为空会循环,此时对应的线程会死掉。此时主函数的循环将死掉的线程去除,在线程数不足个的情况下,接下来的循环继续制造新的线程。 上一篇文章: 从0开始写一个多线程爬虫(1) 我们用继承Thread类的方式来改造多线程爬虫,其实主要就是把上一篇文章的代码写到线程类的run方...

    yangrd 评论0 收藏0
  • Python

    摘要:最近看前端都展开了几场而我大知乎最热语言还没有相关。有关书籍的介绍,大部分截取自是官方介绍。但从开始,标准库为我们提供了模块,它提供了和两个类,实现了对和的进一步抽象,对编写线程池进程池提供了直接的支持。 《流畅的python》阅读笔记 《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了...

    dailybird 评论0 收藏0
  • Python协程(真才实学,想学的进来)

    摘要:所以与多线程相比,线程的数量越多,协程性能的优势越明显。值得一提的是,在此过程中,只有一个线程在执行,因此这与多线程的概念是不一样的。 真正有知识的人的成长过程,就像麦穗的成长过程:麦穗空的时候,麦子长得很快,麦穗骄傲地高高昂起,但是,麦穗成熟饱满时,它们开始谦虚,垂下麦芒。 ——蒙田《蒙田随笔全集》 上篇论述了关于python多线程是否是鸡肋的问题,得到了一些网友的认可,当然也有...

    lykops 评论0 收藏0
  • 关于Python爬虫种类、法律、轮子的一二三

    摘要:一般用进程池维护,的设为数量。多线程爬虫多线程版本可以在单进程下进行异步采集,但线程间的切换开销也会随着线程数的增大而增大。异步协程爬虫引入了异步协程语法。 Welcome to the D-age 对于网络上的公开数据,理论上只要由服务端发送到前端都可以由爬虫获取到。但是Data-age时代的到来,数据是新的黄金,毫不夸张的说,数据是未来的一切。基于统计学数学模型的各种人工智能的出现...

    lscho 评论0 收藏0
  • 优雅的使用WebMagic框架Java爬虫

    摘要:优雅的使用框架,爬取唐诗别苑网的诗人诗歌数据同时在几种动态加载技术中对比作选择虽然差不多两年没有维护,但其本身是一个优秀的爬虫框架的实现,源码中有很多值得参考的地方,特别是对爬虫多线程的控制。 优雅的使用WebMagic框架,爬取唐诗别苑网的诗人诗歌数据 同时在几种动态加载技术(HtmlUnit、PhantomJS、Selenium、JavaScriptEngine)中对比作选择 We...

    leejan97 评论0 收藏0

发表评论

0条评论

imccl

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<