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

相关文章

系统架构师考试学习笔记第三篇——架构设计高级知识(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

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使