Python爬虫入门教程 14-100 All IT eBooks多线程爬取

1.All IT eBooks多线程-写在前面

对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来。 然后放着,是的,就这么放着.......然后慢慢的遗忘掉.....

All IT eBooks多线程-爬虫分析

打开网址 http://www.allitebooks.com/ 发现特别清晰的小页面,一看就好爬

在点击一本图书进入,发现下载的小链接也很明显的展示在了我们面前,小激动一把,这么清晰无广告的网站不多见了。

All IT eBooks多线程-撸代码

这次我采用了一个新的模块 requests-html 这个模块的作者之前开发了一款 requests,你应该非常熟悉了,线程控制采用的 queue
安装 requests-html 模块

pip install requests-html

关于这个模块的使用,你只需要使用搜索引擎搜索一下这个模块名称,那文章也是很多滴,作为能学到这篇博客的你来说,是很简单的拉~

我们编写一下核心的内容

from requests_html import HTMLSession
from queue import Queue
import requests
import random

import threading
CARWL_EXIT = False
DOWN_EXIT = False

#####
# 其他代码
####
if __name__ == ‘__main__‘:

    page_queue = Queue(5)
    for i in range(1,6):
        page_queue.put(i)  # 把页码存储到page_queue里面

    # 采集结果
    data_queue = Queue()

    # 记录线程列表
    thread_crawl = []
    # 每次开启5个线程
    craw_list = ["采集线程1号","采集线程2号","采集线程3号","采集线程4号","采集线程5号"]

    for thread_name in craw_list:
        c_thread = ThreadCrawl(thread_name,page_queue,data_queue)
        c_thread.start()
        thread_crawl.append(c_thread)

    while not page_queue.empty():
        pass

    # 如果page_queue为空,采集线程退出循环
    CARWL_EXIT = True
    for thread in thread_crawl:
        thread.join()
        print("抓取线程结束")

上面就是爬取图书详情页面的线程了,我开启了5个线程爬取,页码也只爬取了5 页,如果你需要更多的,只需要修改

    page_queue = Queue(5)
    for i in range(1,6):
        page_queue.put(i)  # 把页码存储到page_queue里面

下面我们把 ThreadCrawl 类编写完毕

session = HTMLSession()

# 这个地方是 User_Agents 以后我把他配置到服务器上面,就可以远程获取了  这个列表里面有很多项,你自己去源码里面找吧
USER_AGENTS = [
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20"
]
# 获取图书下载链接的线程类
class ThreadCrawl(threading.Thread):
    # 构造函数
    def __init__(self,thread_name,page_queue,data_queue):

        super(ThreadCrawl,self).__init__()
        self.thread_name = thread_name
        self.page_queue = page_queue
        self.data_queue = data_queue
        self.page_url = "http://www.allitebooks.com/page/{}"   #URL拼接模板

    def run(self):
        print(self.thread_name+" 启动*********")

        while not CARWL_EXIT:
            try:
                page = self.page_queue.get(block=False)
                page_url = self.page_url.format(page)   # 拼接URL操作
                self.get_list(page_url)   # 分析页面链接 

            except Exception as e:
                print(e)
                break

    # 获取当前列表页所有图书链接
    def get_list(self,url):
        try:
            response = session.get(url)
        except Exception as e:
            print(e)
            raise e

        all_link = response.html.find(‘.entry-title>a‘) # 获取页面所有图书详情链接

        for link in all_link:
            self.get_book_url(link.attrs[‘href‘])   # 获取图书链接

    # 获取图书下载链接
    def get_book_url(self,url):
        try:
            response = session.get(url)

        except Exception as e:
            print(e)
            raise e

        download_url = response.html.find(‘.download-links a‘, first=True)

        if download_url is not None: # 如果下载链接存在,那么继续下面的爬取工作
            link = download_url.attrs[‘href‘]
            self.data_queue.put(link)   # 把图书下载地址 存储到 data_queue里面,准备后面的下载
            print("抓取到{}".format(link))

上述代码一个非常重要的内容就是把图书的下载链接存储到了data_queue 里面,这些数据 在另一个下载线程里面是最基本的数据。

下面开始 编写图书下载的类和方法。

我开启了4个线程,操作和上面的非常类似

class ThreadDown(threading.Thread):
    def __init__(self, thread_name, data_queue):
        super(ThreadDown, self).__init__()
        self.thread_name = thread_name
        self.data_queue = data_queue

    def run(self):
        print(self.thread_name + ‘ 启动************‘)
        while not DOWN_EXIT:
            try:
                book_link = self.data_queue.get(block=False)
                self.download(book_link)
            except Exception as e:
                pass

    def download(self,url):
        # 随机浏览器User-Agent
        headers = {"User-Agent":random.choice(USER_AGENTS)}
        # 获取文件名字
        filename = url.split(‘/‘)[-1]
        # 如果url里面包含pdf
        if ‘.pdf‘ in url or ‘.epub‘ in url:
            file = ‘book/‘+filename  # 文件路径已经写死,请在跟目录先创建好一个book文件夹
            with open(file,‘wb‘) as f:  # 开始二进制写文件
                print("正在下载 {}".format(filename))
                response = requests.get(url,stream=True,headers=headers)
                # 获取文件大小
                totle_length = response.headers.get("content-length")
                # 如果文件大小不存在,则直接写入返回的文本
                if totle_length is None:
                    f.write(response.content)
                else:
                    for data in response.iter_content(chunk_size=4096):
                        f.write(data)
                    else:
                        f.close()

                print("{}下载完成".format(filename))

if __name__ == ‘__main__‘: 

# 其他代码在上面
    thread_image = []
    image_list = [‘下载线程1号‘, ‘下载线程2号‘, ‘下载线程3号‘, ‘下载线程4号‘]
    for thread_name in image_list:
        d_thread = ThreadDown(thread_name, data_queue)
        d_thread.start()
        thread_image.append(d_thread)

    while not data_queue.empty():
        pass

    DOWN_EXIT = True
    for thread in thread_image:
        thread.join()
        print("下载线程结束")

如果你把我上面的代码都组合完毕,那么应该可以很快速的去爬取图书了,当然这些图书都是英文了,下载下来你能不能读....... 我就不知道了。

×××地址,去上篇博客找吧~~~~

原文地址:https://blog.51cto.com/1615800/2396848

时间: 2024-10-07 14:32:13

Python爬虫入门教程 14-100 All IT eBooks多线程爬取的相关文章

Python爬虫入门教程 15-100 石家庄政民互动数据爬取

1. 石家庄政民互动数据爬取-写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为http://www.sjz.gov.cn/col/1490066682000/index.html 首先声明,为了学习,绝无恶意抓取信息,不管你信不信,数据我没有长期存储,预计存储到重装操作系统就删除. 2. 石家庄政民互动数据爬取-网页分析 点击更多回复 ,可以查看到相应的数据. 数据量很大14万条,,数据爬完,还可以用来学习数据分析,真是nice 经

Python爬虫入门【2】:妹子图网站爬取

妹子图网站爬取---前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们需要准备一个火狐浏览器,还需要准备抓包工具,抓包工具,我使用的是CentOS自带的tcpdump,加上wireshark ,这两款软件的安装和使用,建议你还是学习一下,后面我们应该会用到. 妹子图网站爬取---网络请求模块requests 妹子图网站爬取---安装requests 打开终端:使用命令

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1

Python爬虫入门教程: All IT eBooks多线程爬取

All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着,是的,就这么放着.......然后慢慢的遗忘掉..... All IT eBooks多线程爬取-爬虫分析 打开网址 http://www.allitebooks.com/ 发现特别清晰的小页面,一看就好爬 在点击一本图书进入,发现下载的小链接也很明显的展示在了我们面前,小激动一把,这么清晰无广告的

Java分布式爬虫Nutch教程——导入Nutch工程,执行完整爬取

Java分布式爬虫Nutch教程--导入Nutch工程,执行完整爬取 by briefcopy · Published 2016年4月25日 · Updated 2016年12月11日 在使用本教程之前,需要满足条件: 1)有一台Linux或Linux虚拟机 2)安装JDK(推荐1.7) 3)安装Apache Ant 下载Nutch源码: 推荐使用Nutch 1.9,官方下载地址:http://mirrors.hust.edu.cn/apache/nutch/1.9/apache-nutch-1

Python爬虫入门教程 2-100 妹子图网站爬取

前言 从今天开始就要撸起袖子,直接写Python爬虫了,学习语言最好的办法就是有目的的进行,所以,接下来我将用10+篇的博客,写爬图片这一件事情.希望可以做好. 为了写好爬虫,我们需要准备一个火狐浏览器,还需要准备抓包工具,抓包工具,我使用的是CentOS自带的tcpdump,加上wireshark ,这两款软件的安装和使用,建议你还是学习一下,后面我们应该会用到. 网络请求模块requests Python中的大量开源的模块使得编码变的特别简单,我们写爬虫第一个要了解的模块就是requests

Python爬虫入门教程 4-100 美空网未登录图片爬取

简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可以了,或者带带我也行. 爬虫分析 首先,我们已经爬取到了N多的用户个人主页,我通过链接拼接获取到了 http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html 在这个页面中,咱们要找几个核心的关键点,发现平面拍摄点击进入的是图片列表页面. 接下来开始

Python爬虫入门教程:蜂鸟网图片爬取

1. 蜂鸟网图片--简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习,不要用于商业目的,不出意外,蜂鸟是有版权保护的网站. 2. 蜂鸟网图片--网站分析 第一步,分析要爬取的网站有没有方法爬取,打开页面,找分页 http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=

最详细的Python爬虫入门教程,一篇文章入门爬虫不是儿戏!

0×00 介绍 0×01 要求 0×02 你能学到什么? 0×03 知识补充 0×04 最简单的开始 0×05 更优雅的解决方案 0×06 url合法性判断 0×07 总结与预告 0×00 介绍 学习Python中有不明白推荐加入交流群 号:548377875 群里有志同道合的小伙伴,互帮互助, 群里有不错的学习教程! 爬虫技术是数据挖掘,测试技术的重要的组成部分,是搜索引擎技术的核心. 但是作为一项普通的技术,普通人同样可以用爬虫技术做很多很多的事情,比如:你想了解一下某网所有关于爬虫技术的文

Python爬虫入门教程 3-100 美空网数据爬取

简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 下面这个网址 http://www.moko.cc/post/1302075.html 然后在去分析一下,我需要找到一个图片列表页面是最好的,作为一个勤劳的爬虫coder,我找到了这个页面 http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html 列