验证部分:

from bs4 import BeautifulSoup
import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
}url = 'http://www.ifanjian.net/jiantu-1'r = requests.get(url=url, headers=headers)# print(r.text)soup = BeautifulSoup(r.text, 'html.parser')# 我擦人间迷惑行为
# 为什么是两个p?
# 我明明只看到一个啊
html = '''<p></p><p><img class="lazy" data-src="http://hk-ww1rsfanjian.oss-accelerate.aliyuncs.com/c/b8/ed/e9/65b8e8f383eda2a50de98318b262c16d.gif" alt="" sizes="0.94" src="http://hk-ww1rsfanjian.oss-accelerate.aliyuncs.com/c/b8/ed/e9/65b8e8f383eda2a50de98318b262c16d.gif" style="display: inline;" width="271" height="250"></p><p></p> '''
# print(ret)
# 上面两个p不是平行的吗?# ret = soup.find_all('img', class_='lazy')
# print(ret[0]['data-src'])image_url = []
image_title = []
items = []
# print(ret)
ret = soup.select('.cont-list-main > p > p > img')
for i in range(0, len(ret)):image_url.append(ret[i]['data-src'])ret = soup.select('.cont-list-title > a')
for i in range(0, len(ret)):image_title.append(ret[i]['title'])items = dict(zip(image_title, image_url))
print(items)# 注意,只有find后面才能加[]来提取指定的属性,是因为find找到的是一个string
# 但find_all和selec找到的是列表,所以要一个一个的提取,转化为string类型

最终代码:

import threading
import time
from queue import Queue
import requests
from bs4 import BeautifulSoup
import json# 用来存放采集线程
g_crawl_list = []
# 用来存放解析线程
g_parse_list = []class CrawlTread(threading.Thread):def __init__(self, name, page_queue, data_queue):super(CrawlTread, self).__init__()self.name = nameself.page_queue = page_queueself.data_queue = data_queueself.url = 'http://www.ifanjian.net/jiantu-{}'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',}def run(self):print('%s----线程启动' % self.name)while not self.page_queue.empty():# 从队列中取出页码page = self.page_queue.get()# 拼接url,发送请求url = self.url.format(page)r = requests.get(url=url, headers=self.headers)# 将相应内容存入data_queue中self.data_queue.put(r.text)print('%s----线程结束' % self.name)class ParserThread(threading.Thread):page_done = 0def __init__(self, name, data_queue, fp, lock):super(ParserThread, self).__init__()self.name = nameself.data_queue = data_queueself.fp = fpself.lock = lockdef parse_content(self, data):# 创建空列表image_url = []image_title = []items = []soup = BeautifulSoup(data, 'html.parser')# 获取图片地址ret = soup.select('.cont-list-main > p > p > img')for i in range(0, len(ret)):image_url.append(ret[i]['data-src'])# 获取图片标题ret = soup.select('.cont-list-title > a')for i in range(0, len(ret)):image_title.append(ret[i]['title'])items = dict(zip(image_title, image_url))# print(items)# 写到文件中self.lock.acquire()self.fp.write(json.dumps(items, ensure_ascii=False) + '\n')self.lock.release()def run(self):print('%s----线程开始' % self.name)while not self.data_queue.empty():# 从data_queue中取出一页数据data = self.data_queue.get()# print(data)# 解析内容self.parse_content(data)print('%s----线程结束' % self.name)def create_queue():# 创建页码队列page_queue = Queue()for page in range(1, 6):page_queue.put(page)# 创建内容队列data_queue = Queue()return page_queue, data_queue# 创建采集线程
def create_crawl_thread(page_queue, data_queue):crawl_name = ['采集线程1号', '采集线程2号', '采集线程3号']for name in crawl_name:# 创建一个采集线程tcrawl = CrawlTread(name, page_queue, data_queue)# 保存到列表中g_crawl_list.append(tcrawl)# 创建解析线程
def create_parse_thread(data_queue, fp, lock):parse_name = ['解析线程1号', '解析线程2号', '解析线程3号']for name in parse_name:# 创建一个解析线程tparse = ParserThread(name, data_queue, fp, lock)# 保存到列表中g_parse_list.append(tparse)def main():# 创建队列page_queue, data_queue = create_queue()# 打开文件,注意要注明打开文件的编码类型,否则会报错fp = open('jian.json', 'a', encoding='utf-8')# 创建锁lock = threading.Lock()# 创建采集线程create_crawl_thread(page_queue, data_queue)# 创建解析线程create_parse_thread(data_queue, fp, lock)# 启动所有采集线程for tcrawl in g_crawl_list:tcrawl.start()# print(len(threading.enumerate()))while len(threading.enumerate()) > 1:# 这里写线程数大于一是因为主线程也算一个time.sleep(1)# 启动所有解析线程for tparse in g_parse_list:tparse.start()# print(threading.enumerate())# 主线程等待子线程结束for tcrawl in g_crawl_list:tcrawl.join()for tparse in g_parse_list:tparse.join()print('主线程和子线程全部结束')if __name__ == '__main__':main()

项目之多线程爬取犯贱网相关推荐

  1. 多线程 爬取 趣图网

    原文链接: 多线程 爬取 趣图网 上一篇: 百度网盘获取私密分享的文件 下一篇: 欧几里得距离.曼哈顿距离和切比雪夫距离 # coding=utf-8import urllib import urll ...

  2. 斗图斗不过小伙伴?python多线程爬取斗图网表情包,助你成为斗图帝!

    最近python基础课讲到了多线程,老师让交个多线程的实例练习.于是来试试多线程爬虫,正好复习一下mooc上自学的嵩天男神的爬虫知识.想法很美好,过程却很心酸,从早上开始写,每次出现各种奇怪问题,到现 ...

  3. 爬虫笔记——多线程爬取斗图网表情包(threading)

    爬虫笔记--多线程爬取斗图网表情包(threading) 网站观察 爬取框架 具体代码 斗图网网址:斗图网,这里以爬取最新套图为例. 网站观察 在网页翻页操作中可以看到网页是非动态加载的(page为页 ...

  4. python3爬虫——多线程爬取斗图网表情包

    本文用多线程生产者,消费者模式爬取斗图网的表情包,并下载保存到本地,get_page()函数负责获取页面的图片的url链接,downlod_img()函数通过图片url下载保存到本地文件夹中,开启多线 ...

  5. Python爬虫攻略(2)Selenium+多线程爬取链家网二手房信息

    申明:本文对爬取的数据仅做学习使用,请勿使用爬取的数据做任何商业活动,侵删 前戏 安装Selenium: pip install selenium 如果下载速度较慢, 推荐使用国内源: pip ins ...

  6. 多线程爬取斗图网表情包

    import requests import re import queue import threading import timeHeaders = {'User-Agent': 'Mozilla ...

  7. 多线程爬取包图网背景音乐

    本文旨在交流学习,勿作他用,否则后果自负 import csv import threading import random import requests from lxml import etre ...

  8. 基于python多线程和Scrapy爬取链家网房价成交信息

    文章目录 知识背景 Scrapy- spider 爬虫框架 SQLite数据库 python多线程 爬取流程详解 爬取房价信息 封装数据库类,方便多线程操作 数据库插入操作 构建爬虫爬取数据 基于百度 ...

  9. python爬取小说基本信息_python实战项目:爬取某小说网

    项目文档: 项目简介: 爬取某小说网首页中的全部小说,并储存到数据库中 项目版本 :python2.7.12 项目源码: 源码已上传 github: 源码github 项目总览: 1. 爬取小说首页中 ...

最新文章

  1. MySQL语句相关经验总结
  2. 杭州(含嘉兴,绍兴,金华,湖州,义乌)Uber优步司机奖励政策(1月18日~1月24日)...
  3. 数据库数据格式化之Kettle Spoon
  4. CodeForces - 1252D Find String in a Grid(AC自动机)
  5. echarts 折线图 设置y轴最小刻度_【硬货】vue全家桶+Echarts+百度地图,搭建数据可视化系统...
  6. Option键用的好,鼠标用的少(这6个你绝对不知道的...)
  7. 在IDEA中安装使用Antlr
  8. OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
  9. K3路由器官改V2.1D设置定时重启
  10. python aes new_python AES 加密
  11. 几种常见电源防反接设计
  12. Node-RED使用指南:7:配置与设定总结:其他配置
  13. Java连rabbitMQ 报错 An unexpected connection driver error occured
  14. IEEP-OSPF域内路由故障-现象与排障思路
  15. 迅为i.MX6ULL终结者Mfgtools修改单独只烧写Uboot,内核,文件系统
  16. SVPWM空间矢量脉冲宽度调制技术控制电机
  17. libusb系列-007-Qt下使用libusb1.0.26源码
  18. 内是不是半包围结构_半包围结构(软笔)
  19. 软件工程课程设计——技术栈【Go+Vue+PGSQL】的人事管理系统
  20. JAVA中的集合概念

热门文章

  1. 帮我写一束粉红色花的贺卡
  2. 赛思互动:CRM与ERP、SCM的集成
  3. 《宝贝,你听到了吗》歌词
  4. H264 NALU说明
  5. Linux征途——进程间通信
  6. linux-cronolog的使用
  7. SCADE介绍—模型检测在航空领域的应用
  8. NASA:汤加火山羽流创最高纪录 离地58公里
  9. python实现学生管理系统的论文_python实现学生管理系统v1
  10. 高阶累积量四阶矩_基于四阶累积量的LCMV自适应波束形成算法