验证部分:

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. Spring Boot轻松理解动态注入,删除bean
  2. python的高级函数_Python的高级函数
  3. linux启动java包脚本
  4. 1025 反转链表 (25分)
  5. H3C批量收集服务器信息,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)...
  6. java的堆排序_java中什么是堆排序?堆排序介绍
  7. TokenInsight:BTC网络活跃度保持历史高位,人气居高不下
  8. tornado 重定向404
  9. '' and 'and' difference in python
  10. SQL SERVER 2005下载(本地使用)
  11. 中兴捧月算法挑战赛-RAW夜景图像去噪总结
  12. html怎么设置字体的背景颜色,html怎样设置字体的背景颜色?
  13. vs2008设置选中 高亮
  14. torchvision.datasets.FashionMNIST报错[WinError 10054] 远程主机强迫关闭了一个现有的连接
  15. COSOSWAP官网2.0升级——线上圆桌会议重点回顾
  16. gitlab小记(一)
  17. 新版qq虚拟摄像头颜色不正常_分享 | 在线教学常见问题QQ直播、视频通话、群课堂...
  18. h5如何上传文件二进制流_前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输...
  19. QQ自动登录/QQ登录器/程序源代码/VS2010/VS2012/VC/MFC
  20. 深度学习笔记(深度学习环境搭建)

热门文章

  1. cf659 Round #346 Div2-E【DSU+判环】
  2. java 小写金额转大写(八位)
  3. 树莓派-从入手到使用(二):树莓派 换源
  4. 案例04:几何图形绘制
  5. 微信小程序之图片懒加载
  6. python的open函数使用
  7. 爬取我爱我家网站二手房信息
  8. 「云网络安全」为AWS S3和Yum执行Squid访问策略
  9. Python软件编程等级考试二级——20200614B
  10. 移动端字体图标不显示的Bug