python多线程爬取图片二

上一篇的多线程是使用类创建的,这一次使用函数创建多线程,还是同一个网站https://www.quanjing.com/category/1286521/1.html,

代码如下:

 1 # 多线程,自动创建文件夹,每个页面单独存储一个文件夹
 2
 3 import requests
 4 import threading
 5 import re
 6 import time
 7 import queue
 8 import os
 9 from bs4 import BeautifulSoup
10
11
12 string = ‘https://www.quanjing.com/category/1286521/‘
13 url_queue = queue.Queue()
14 pipei = re.compile(‘lowsrc="(.*?)" m=‘)        # 定义正则表达式,匹配出每一张图片的链接
15
16
17 def get_url(page):          # 根据传入的页面数,创建1-page每个页面的url
18     for i in range(1, page+1):
19         url = string + str(i) + ‘.html‘      # 拼接url
20         url_queue.put(url)            # 把每个url放入队列中
21     # print(url_queue.queue)
22
23
24 def spider(url_queue):      # 爬取函数
25     url = url_queue.get()    # 从队列中取出最前面的url
26     floder_count = url[-7:-5]  # 判断当前爬取的为第几页,用于后面的创建文件夹,如果页数为两位数,则会截取当前页数,如果为一位数字,则会截取当前页数和前面的‘/’符号
27     if floder_count[0] == ‘/‘:
28         floder_name = floder_count[1]
29     else:
30         floder_name = floder_count
31     os.mkdir(‘第{0}页‘.format(floder_name)) # mkdir创建文件夹
32     html = requests.get(url=url).text
33     soup = BeautifulSoup(html, ‘lxml‘)    # 对源码进行解析
34     ul = soup.find_all(attrs={"class": "gallery_list"})    # 提取出图片链接的部分
35     # print(ul)
36     lianjies = re.findall(pipei, str(ul))       # 匹配出每一张图片的链接,正则匹配必须是字符串类型
37     i = 1
38     for lianjie in lianjies:
39         # print(lianjie)
40         result = requests.get(url=lianjie).content    # 二进制方式请求每张图片,并存储。
41         with open(‘第{0}页\{1}.jpg‘.format(floder_name, i), ‘ab‘) as f:
42             f.write(result)
43         print(‘第{0}页第{1}张存储完成‘.format(floder_name, i))
44         i += 1
45
46     if not url_queue.empty():    # 如果队列未空,则该线程继续工作,从队列中取出url
47         spider(url_queue)
48
49
50 def main():      # main函数,用于线程的创建,线程的启动
51     queue_list = []    # 线程列表
52     queue_count = 3    # 线程数量
53     for i in range(queue_count):
54         t = threading.Thread(target=spider, args=(url_queue, ))  # 创建线程,第一个参数为线程要调用的函数,第二个参数为函数的参数
55         queue_list.append(t)        # 把线程加入队列
56     for t in queue_list:    # 线程开始
57         t.start()
58     for t in queue_list:  # 等待所有线程结束
59         t.join()
60
61
62 if __name__ == ‘__main__‘:
63     page = int(input("请输入需要爬取的页数:"))
64     get_url(page)
65     start_time = time.time()
66     main()
67     print("test3用时:%f" % (time.time() - start_time))    # 计算爬取用时                                                                                                    

在写代码时,遇到了两点困难:一是队列未空时,怎么让线程继续工作。刚开始是在if判断后调用main函数,但这样做等于又重新定义了新的线程,并不是之前的线程在继续工作,且有时候会存在爬取不完的情况,后来尝试调用spider函数,爬取成功

第二个困难是文件夹的创建,刚开始没有对截图的两个字符进行判断,导致创建失败,百度一下后发现可以用makedirs解决,试了后发现这样创建的是多级目录,也不行,(可能是‘/’字符的缘故),后来加了一个判断,才解决这一问题。

写完这两个多线程爬虫,才算是了解了线程的工作机制的程序。(ps:若有错误的地方,欢迎大佬随时指正。。xixix)

原文地址:https://www.cnblogs.com/liangxiyang/p/11146065.html

时间: 2024-10-10 14:47:38

python多线程爬取图片二的相关文章

python多线程爬取图片实例

今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1.html, 下面是代码,难点直接在后面注释了. # 多线程爬取,每个线程爬取一个页面 import requests import threading import queue from bs4 import BeautifulSoup import re import time string =

[python爬虫] 爬取图片无法打开或已损坏的简单探讨

本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时,作者将进一步帮你巩固selenium自动化操作和urllib库等知识.        感谢朋友"露为霜"的帮助!希望以后能实现强大的图片爬虫代码~ 一. 引入Selenium自动爬取百度图片 下面这部分Selenium代码的主要功能是:            1.先自动运行浏览器,并访问

python多线程爬取网页

#-*- encoding:utf8 -*- ''' Created on 2018年12月25日 @author: Administrator ''' from multiprocessing.dummy import Pool as pl import csv import requests from lxml import etree def spider(url): header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1

Python 多线程 使用线程 (二)

Python中实现多线程需要使用到 threading 库,其中每一个 Thread类 的实例控制一个线程. Thread类 #类签名 def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): 简单介绍一些初始化参数: target: 指定线程由 run () 方法调用的可调用对象.默认为 None, 意味着不调用任何内容. name: 指定该线程的名称. 在默认情况

python多线程爬取-今日头条的街拍数据(附源码加思路注释)

这里用的是json+re+requests+beautifulsoup+多线程 1 import json 2 import re 3 from multiprocessing.pool import Pool 4 5 import requests 6 from bs4 import BeautifulSoup 7 from config import * 8 from requests import RequestException 9 10 11 def get_page_index(of

python 简单爬取图片

现在的网站大多做了反爬处理,找一个能爬的网站还真不容易. 高清的图片很难爬,只能爬一些网站开始录目的小文件图片. 主要要做好隐藏.这里就做一个比较简单的代码试一试 1 import urllib.request 2 import re 3 4 def gethtml(url): 5 page=urllib.request.urlopen(url) 6 html=page.read().decode('utf-8') 7 8 return html 9 10 def getimg(html): 1

python多线程(二)

原文:http://blog.sina.com.cn/s/blog_4b5039210100esc1.html 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时候,只有一个程序在CPU中运行.同样,虽然python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行. 对pyt

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

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

python网络爬虫之使用scrapy爬取图片

在前面的章节中都介绍了scrapy如何爬取网页数据,今天介绍下如何爬取图片. 下载图片需要用到ImagesPipeline这个类,首先介绍下工作流程: 1 首先需要在一个爬虫中,获取到图片的url并存储起来.也是就是我们项目中test_spider.py中testSpider类的功能 2 项目从爬虫返回,进入到项目通道也就是pipelines中 3 在通道中,在第一步中获取到的图片url将被scrapy的调度器和下载器安排下载. 4 下载完成后,将返回一组列表,包括下载路径,源抓取地址和图片的校