【爬虫专栏20】拉勾网爬虫(单线程和多线程)

2024-02-13 11:18

本文主要是介绍【爬虫专栏20】拉勾网爬虫(单线程和多线程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

拉勾网爬虫

    • 爬取方法
    • 注意事项
    • 关键示例
    • 单线程示例
    • 多线程示例
    • 爬到的部分数据

爬取方法

emmmm这里就是从主页开始,找到页码的规律

这个规律还是挺好找的,就是页码变了而已
在这里插入图片描述
下面是拉钩主页页面在这里插入图片描述
这个审查元素幅值xpath标签啥的我就不多说了吧在这里插入图片描述

注意事项

1.#拉勾网有反爬,cookies变化
参考网址https://www.cnblogs.com/kuba8/p/10808023.html解决cookies变化问题

2.出现数据存在空格,换行符,需要利用strip或者replace函数去清洗数据
下面两种方法都可以有效进行清洗

#1.
set = list(set(lists))
set.sort(key=lists.index)
set.remove('')
#2.
s=[x.strip() for x in list1 if x.strip()!='']

关键示例

针对福利一项的清洗

#公司福利welfare = x.xpath('//*[@id="s_position_list"]/ul/li/div[2]/div[2]/text()')welfare=[exp.replace('“', '').replace('”', '') for exp in welfare if exp.strip()!='']

这是针对pandas的应用

data = {'names':names, 'direction':dire, 'money':money, 'experience':experience, 'condition':condition,'company':company, 'welfare':welfare}basic_data = pd.DataFrame.from_dict(data = data)

单线程示例

利用xpath

同时为了更好的清理数据,还利用了pandas的dataframe模块

import requests
import re
from requests.exceptions import  RequestException
from lxml import etree
from queue import Queue
import threading
import pandas as pd 
import timedef get_one_page(url):try:time.sleep(0.5)headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}#应对拉钩的反爬措施s = requests.Session() # 创建一个session对象s.get(url, headers=headers, timeout=3)  # 用session对象发出get请求,请求首页获取cookiescookie = s.cookies  # 为此次获取的cookiesresponse = s.post(url, headers=headers, cookies=cookie, timeout=3)  # 获取此次文本#response = requests.get(url, headers = headers)#response.encoding = response.apparent_encodingif response.status_code==200:#print(response)return response.text#return response.content.decode("utf8", "ignore")return Noneexcept RequestException:return Nonedef parse_one_page(html):x = etree.HTML(html)#职位名称names = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[1]/div[1]/a/h3/text()')#//*[@id="s_position_list"]/ul/li[3]/div[1]/div[1]/div[1]/a/h3#print(names)#地点dire = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[1]/div[1]/a/span/em/text()')#print(dire)#薪资money = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[1]/div[2]/div/span/text()')#print(len(money))#经验experience = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[1]/div[2]/div/text()')#爬虫数据清洗 experience=[exp.strip() for exp in experience if exp.strip()!='']#print(experience)#公司条件condition = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[2]/div[2]/text()')condition=[exp.strip() for exp in condition if exp.strip()!='']#公司名称company = x.xpath('//*[@id="s_position_list"]/ul/li/div[1]/div[2]/div[1]/a/text()')#公司福利welfare = x.xpath('//*[@id="s_position_list"]/ul/li/div[2]/div[2]/text()')welfare=[exp.replace('“', '').replace('”', '') for exp in welfare if exp.strip()!='']#print(welfare)#利用字典存储多个内容,这样就可以避免使用for语句使元组隔开后分开读取了,是另外一种可行方法data = {'names':names, 'direction':dire, 'money':money, 'experience':experience, 'condition':condition,'company':company, 'welfare':welfare}basic_data = pd.DataFrame.from_dict(data = data)basic_data.to_csv(r'xxx.csv', index=False, mode='a', header=False)#print(basic_data)def main():page_queue=Queue()html = get_one_page(url)#print(html)print('打印第',(j+1),'页')parse_one_page(html)#这里主要是为多线程埋下伏笔
i = 'dianlusheji'for j in range(5):url = 'https://www.lagou.com/zhaopin/{}/{}/'.format(i, j+1)if __name__=='__main__':main()

多线程示例

与单线程类似,利用队列的知识,随机抽取内容能够加快速度,最后3000条左右数据用了80秒,开了三个线程,本来可以更快

下面只添加必要的代码块
其他和单线程基本一样

#要爬取的队列标题
crawl_list = ['danpianji', 'dianlusheji', 'zidonghua', 'qianrushi', 'yingjian', 'Python'] 

类里面的各个参数定义

def run(self):# # 任务开始事件# start_time = time.time()while True:if self.page_queue.empty():# # 任务结束时间# end_time = time.time()# # 需要时间# print(end_time - start_time)breakelse:print(self.name, '将要从队列中取任务')#这里就是利用了队列的特性,抽取之后就行了,get抽了之后对应的页码就消失了,不然就会重复抽取了page = self.page_queue.get()print(self.name, '取出的任务是:', page)for j in range(30):url = 'https://www.lagou.com/zhaopin/{}/{}/'.format(page, j+1)main(url, j)print(self.name, '完成任务:', page)

爬到的部分数据

这是单线程爬到的图片,5页共75条
这是单线程这是多线程爬到的数据多线程
这里主要的也就是cookies的变化问题,解决这个之后就可以直接爬了,当然用selenium这些也是可以做到的。

总之就是这么多了,该程序亲测可用,也算是我学了半个月爬虫的一个交代吧,文笔也不算好毕竟不是文科生,这也不是我的专业内容只是喜欢,既然喜欢就去做做看了。

那么我第一篇博客就到这里了。谢谢大家!

这篇关于【爬虫专栏20】拉勾网爬虫(单线程和多线程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705399

相关文章

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

python多线程并发测试过程

《python多线程并发测试过程》:本文主要介绍python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、并发与并行?二、同步与异步的概念?三、线程与进程的区别?需求1:多线程执行不同任务需求2:多线程执行相同任务总结一、并发与并行?1、