【爬虫专栏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

相关文章

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de