第十五天-爬虫项目实战

目录

1.介绍

2.代码

1.main.py

2.PageSider.py

3.DetailSpider.py

4.DataParse.py

5.Constant.py

6.HanderRequest.py


1.介绍

1. 使用多线程爬取网站

2.爬取数据后保存至excel

3.爬取网站(仅做测试)网创类项目爬取:https://www.maomp.com/

4..实现效果

2.代码

1.main.py

# coding:utf-8
import threadingimport requests
from  queue import Queue
from PageSpider import PageSpider
from DetailSpider import DetailSpider
from DataParse import DataParse
import xlsxwriter
import time
"""
爬取网站:https://www.maomp.com/wzjc/
爬取信息,保存至Excel
"""def start_page(threadsize,page_queue,detail_queue):# 开启线程,开始采集page页面page_spider_threadsize = threadsizepage_spider_list = []for i in range(1,page_spider_threadsize+1):pageSpiderThread = PageSpider(thread_name="页面采集线程"+str(i), page_queue=page_queue, detail_queue=detail_queue)# 启动线程pageSpiderThread.start()page_spider_list.append(pageSpiderThread)# 查看队列是否有数据while not page_queue:pass# 释放资源for page_spider in page_spider_list:if page_spider.is_alive():page_spider.join()def start_detail(threadsize,detail_queue,data_queue):# 开启线程,开始采集page页面detail_spider_threadsize = threadsizedetail_spider_list = []for i in range(1, detail_spider_threadsize + 1):detailSpiderThread = DetailSpider(thread_name="详情页采集线程" + str(i), detail_queue=detail_queue,data_queue=data_queue)# 启动线程detailSpiderThread.start()detail_spider_list.append(detailSpiderThread)# 查看队列是否有数据while not detail_queue:pass# 释放资源for detail_spider in detail_spider_list:if detail_spider.is_alive():detail_spider.join()def start_data_parse(threadsize,data_queue,book):# 开启线程,开始采集page页面lock=threading.Lock()sheet1 = book.add_worksheet("sheet1")title_data = ("网址", "标题", "发布时间", "内容")# 添加表头for index, title_datum in enumerate(title_data):sheet1.write(0, index, title_datum)spider_list = []for i in range(1, threadsize + 1):thread = DataParse(thread_name="数据解析线程" + str(i), data_queue=data_queue,lock=lock,sheet=sheet1)# 启动线程thread.start()spider_list.append(thread)# 查看队列是否有数据while not data_queue:pass# 释放资源for parse in spider_list:if parse.is_alive():parse.join()def main(xlswriter=None):#定义页面队列,存放page页信息page_queue = Queue()#定义详情页队列detail_queue = Queue()#定义详情页数据队列data_queue = Queue()page_start=1page_end=1for i in range(page_start,page_end+1):page_url="https://www.maomp.com/wzjc/page/{}/".format(i)page_queue.put(page_url)print("页面队列:",page_queue.qsize())#启动采集分页start_page(threadsize=3,page_queue=page_queue,detail_queue=detail_queue)#启动详情页采集start_detail(threadsize=3, detail_queue=detail_queue, data_queue=data_queue)# 启动数据解析#创建存放excel文件夹book = xlsxwriter.Workbook(time.strftime("%Y%m%d%H%M%S",time.gmtime())+"文件.xlsx")start_data_parse(threadsize=5,data_queue=data_queue,book=book)book.close()print("分页数据个数:",page_queue.qsize())print("详情页数据个数:", detail_queue.qsize())print("数据数据个数:", data_queue.qsize())if __name__ == '__main__':main()

2.PageSider.py

# coding:utf-8
import threading
from lxml import etree
import HanderRequestclass PageSpider(threading.Thread):"""页面url,请求多线程类"""def __init__(self,thread_name,page_queue,detail_queue):super(PageSpider,self).__init__()self.thread_name=thread_nameself.page_queue=page_queueself.detail_queue=detail_queuedef parse_detail_url(self,content):"""解析page页获取详情页url:param content:  page页text:return:  返回详情页url"""#页码返回数据html实例化item_html=etree.HTML(content)#解析出索引详情页URLdetail_urls=item_html.xpath("//h2[@class='entry-title']/a/@href")for url in detail_urls:#将详情页url存放到队列中self.detail_queue.put(url)def run(self):#实际发送请求print("{}启动".format(self.thread_name))#需要从page_queue队列中获取数据try:while not self.page_queue.empty():#从队列中获取数据,并设置为非阻塞状态page_url= self.page_queue.get(block=False)#请求页面链接response_text=HanderRequest.send_reqeust(page_url)if response_text:#解析详情urlself.parse_detail_url(response_text)except Exception as e:print("{} 执行异常:{}".format(self.thread_name,e))print("{}结束".format(self.thread_name))

3.DetailSpider.py

# coding:utf-8
import threading
from lxml import etree
import HanderRequestclass DetailSpider(threading.Thread):"""详情页url,请求详情页"""def __init__(self,thread_name,detail_queue,data_queue):super(DetailSpider,self).__init__()self.thread_name=thread_nameself.data_queue=data_queueself.detail_queue=detail_queuedef run(self):#实际发送请求print("{}启动".format(self.thread_name))#需要从page_queue队列中获取数据try:while not self.detail_queue.empty():#从队列中获取数据,并设置为非阻塞状态detail_url= self.detail_queue.get(block=False)#请求页面链接response_text=HanderRequest.send_reqeust(detail_url)if response_text:data={"url":detail_url,"html_content":response_text}#存放data_queuq数据self.data_queue.put(data)except Exception as e:print("{} 执行异常:{}".format(self.thread_name,e))print("{}结束".format(self.thread_name))

4.DataParse.py

# coding:utf-8
import threading
from lxml import etree
import Constantclass DataParse(threading.Thread):"""详情页数据处理"""def __init__(self,thread_name,data_queue,lock,sheet):super(DataParse,self).__init__()self.thread_name=thread_nameself.data_queue=data_queueself.lock=lockself.sheet=sheetdef __list_join(self,list):return "".join(list)def __parse(self,data):"""解析data_queue数据保存至excel中:return:"""html= etree.HTML(data.get("html_content"))data={"url":data.get("url"),"title": self.__list_join(html.xpath("//h1[@class='entry-title']/text()")),"put_date":self.__list_join(html.xpath("//span[@class='my-date']/text()")),"content_html":self.__list_join(html.xpath("//div[@class='single-content']//p/text()"))}#多线程,使用lock来进行控制并发with self.lock:#写入Excelfor index,e in enumerate(data):self.sheet.write(Constant.CURR_EXCEL_COL,index,data.get(e))Constant.CURR_EXCEL_COL += 1def run(self):#实际发送请求print("{}启动".format(self.thread_name))#需要从page_queue队列中获取数据try:while not self.data_queue.empty():#从队列中获取数据,并设置为非阻塞状态data_content= self.data_queue.get(block=False)#解析html数据self.__parse(data_content)except Exception as e:print("{} 执行异常:{}".format(self.thread_name,e))print("{}结束".format(self.thread_name))

5.Constant.py

# coding:utf-8# excel写入到第几列
CURR_EXCEL_COL=1

6.HanderRequest.py

注意修改cookie

# coding:utf-8import requestsdef send_reqeust(url):#发送数据headers={"Cookie":"xxx","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"}response=requests.get(url,headers=headers)if response.status_code==200 and response:return response.text

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元数据优化:提升您的网站在搜索引擎中的表现

前言 在之前的文章中,我们探讨了如何通过超链接来提高用户在网站的使用体验。本篇将聚焦于元数据的优化,揭示它如何成为提升网站曝光率和点击率的秘密武器。 一、介绍 元数据,或称之为数据的数据,在网页开发中占据着不可忽视的角…

IPD MM流程之业务策略工具:安索夫矩阵

IPD市场管理流程,华为内部称为“MM流程”(Market Management,MM)。华为市场管理是通过对市场和细分市场的分析,制定细分市场的策略,形成商业计划,把商业计划落实在日常工作当中。MM流程其中一个…

git根据文件改动将文件自动添加到缓冲区

你需要修改以下脚本中的 use_cca: false 部分 #!/bin/bash# 获取所有已修改但未暂存的文件 files$(git diff --name-only)for file in $files; do# 检查文件中是否存在"use_cca: false"if grep -q "use_cca: false" "$file"; thenecho "Ad…

qt5-入门-使用拖动方式创建Dialog

参考: C GUI Programming with Qt 4, Second Edition 本地环境: win10专业版,64位,Qt5.12 目录 实现效果基本流程逐步实操1)创建和初始化子部件2)把子部件放进布局中3)设置tab顺序4&#xff09…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号(PID)![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

UE4 Niagara 关卡3.1官方案例解析二

自己尝试做做,打乱顺序 1、新建空的niagara system,添加空的发射器。更换渲染器为网格体渲染器并添加网格体。 2、发射器更新里面添加Spawn Rate,发射个粒子看看 效果图: 3、采样静态网格体,网格体粒子出生于静态网格…

【排序算法】基数排序

一:基本概念 1.1 基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是…

【图说】电脑发展史

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! “结绳记事”是计算的开端 如果说“结绳记事”仅是计数,那么“算筹”就是真正的计算工具 算盘也是我们老祖宗的杰出发明,最擅长“加减乘除”,包括但不限于乘方、开方、对数等。还能进行开发智力的“珠心算…

鼠标失灵怎么办?电脑出现鼠标失灵的详细处理方法介绍

无论是笔记本电脑还是台式机电脑,鼠标是必不可少的外设之一,而我们在使用电脑的过程中,经常回遇到鼠标突然失灵了,不听使唤,控制不了,接下小编来与大家一起分享,遇到这种情况我们该怎么办 有时…

C语言学习笔记(二)

C语言学习 学习笔记(一) 学习笔记(二) 文章目录 C语言学习一、C语言中的数据类型进制二进制八进制十六进制进制转换表 单位换算寻址 数据类型基本类型整数类型整数的有符号和无符号实数类型字符型 构造类型指针类型空类型总结 常量直接常量符号常量转义符 符号常量…

Python并发编程:多线程-GIL全局解释器锁

一 引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势首先:需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比c是一套…

协议(网络协议)

HTTP/HTTPS 协议 HTTP 实际上是个缩写,英文全称是:Hyper Text Transfer Protocol (超文本传输协议)。 最常用的网页(也叫web页)就是一种超文本的具体表现形式。HTTPS (全称:Hyper …

ICASSP2024 | ICMC-ASR 车载多通道语音识别挑战赛总结

为促进驾驶场景中语音处理和识别研究,在ISCSLP 2022上成功举办智能驾驶座舱语音识别挑战 (ICSRC)的基础上,西工大音频语音与语言处理研究组 (ASLPNPU)联合理想汽车、希尔贝壳、WeNet社区、字节、微软、天津大学、南洋理工大学以及中国信息通信研究院等多…

EMO在哪体验?阿里对口型视频生成工具EMO下载地址?阿里巴巴新模型EMO的技术原理

这几天,阿里的对口型视频生成工具EMO火了。根据官方宣传,EMO只需要上传一张图片和一段音频就可以一键生成对口型视频,而且视频中的嘴型还可以与声音匹配。这项技术支持多语言、对话、唱歌以及快速语速的适配,但也可能成为制造虚假…

pip降级在pycharm中

PyCharm依赖于"–build-dir"参数安装第三方库,但该参数在最新的23.0版pip中已删除 解决办法就是降级pip,PyCharm中选择File,找到编译器,点击pip,勾选对应版本即可 或者在cmd中执行运行python -m pip install…

基于centos的linux上docker安装,及mysql、redis等应用在docker容器中的安装

Docker环境安装 安装yum-utils: yum install ‐y yum‐utils device‐mapper‐persistent‐data lvm2为yum源添加docker仓库位置: yum‐config‐manager ‐‐add‐repo https://download.docker.com/linux/centos/docker‐ce.repo如果上面执行命令后…

Linux系统中的高级多线程编程技术

在Linux系统中,多线程编程是一种常见的并发编程模型,通过利用多线程可以实现程序的并发执行,提高系统的性能和响应速度。在Linux系统中,开发人员通常使用 pthread 库来进行多线程编程,同时需要掌握线程同步技术以避免并…

JVM(4)

垃圾回收问题 垃圾回收算法 通过之前的学习我们可以将死亡对象标记出来了,标记出来后我们就可以进行垃圾回收操作了,在正式学习垃圾处理器之前,我们先来看一下垃圾回收器使用的几种算法. 标记-清除算法 "标记-清除"算法是基础的收集算法.算法分为"标记"…

WPF中如何设置自定义控件

1.圆角按钮的设置: 众所周知在WPF中自带有提示信息,当我问创建Button时,点击空格出现如下可选设置 带有小扳手🔧图标为相应的属性,如果Button有CornerRadius(角半径)属性就能够直接设置Button实…

33. 【Linux教程】Linux 用户组

前面小节介绍了 Linux 用户相关的增删改查,本小节介绍 Linux 用户组,Linux 系统中采取了一种安全机制(即用户组),用户组可以允许多个 Linux 用户共享同一种权限。 1. 用户组介绍 Linux 是多任务多用户的操作系统&…