哈喽大家好,我是宁一,今天我们来讲讲Python爬虫,用Python来爬取拉勾网的数据,拉勾网的反爬虫技术做的很厉害,通过普通的header请求总是返回请求频繁的信息
所以我们主要来用selenium这个插件来爬取数据,这个插件就是模拟我们真人的操作,自动点击页面,读取页面内容,就是效率要比用header去进行request请求要低好多
来看看我是怎么操作了,直接看代码吧
文章目录
1、引入插件
首先我们先引用四个插件,分别用来模拟真人抓取网页数据、解析网页数据、时间模块、文件模块
from selenium import webdriver #模拟真人操作网页
import pyquery as pq #解析网页
import time #时间模块
import os #文件模块
2、下载chromedriver插件
(1)查看chrome浏览器版本
在帮助–>关于Google Chrome(E)中查看浏览器的版本信息,我的版本是81.0.4044.138
(2)下载chromedriver插件
打开网址http://npm.taobao.org/mirrors/chromedriver/,选择对应chrome浏览器版本的插件,下载后解压文件,放在与我们现在编辑的Python文件同一个目录下面
然后再代码中引入chromedriver插件,这个插件会帮咱们打开chrome浏览器模拟窗口
path = os.getcwd()
driver = webdriver.Chrome(executable_path=(path+"/chromedriver"))
#等待整个页面加载完成再执行下一步
driver.implicitly_wait(10)
3、定义并请求我们要爬取的网址
这个网址打开是Python应届生岗位的页面
#网址
lagou_http = "https://www.lagou.com/jobs/list_Python/p-city_2?px=default&gx=%E5%85%A8%E8%81%8C&gj=&isSchoolJob=1#filterBox"
#定义一个空列表保存查出来的数据
data = []
driver.get(lagou_http)
4、爬取本页数据,并循环找到每页的下一页按钮
找到下一页按钮就自动点击按钮,并获取到当前网页的数据,用getData方法解析网页数据,并将返回的数据保存到data列表中,getData方法我们后面会编写
找不到下一页按钮就打印数据,跳出循环
while True:
# 找到下一页按钮
next_html = driver.find_element_by_css_selector(".pager_next").get_attribute('class')
if next_html == 'pager_next ':
# 获取到的网页数据
items = pq.PyQuery(driver.page_source).find(".con_list_item")
# print(items)
data += getData(items)
time.sleep(2)
# 点击下一页按钮
driver.find_element_by_xpath("//span[@action='next']").click()
else:
print('数据爬取结束')
print(data)
break
打印获取到的网页数据(只截取了一部分),将这些数据作为参数传到getData方法中处理成我们的最终可视数据
<div>
<div class="p_bot">
<div class="li_b_l">
<span class="money">10k-20k</span>
<!--<i></i>-->经验应届毕业生 / 本科
</div>
</div>
</div>
<div class="company">
<div class="industry">
企业服务,数据服务 / C轮 / 150-500人
</div>
</div>
<div class="list_item_bot">
<div class="li_b_l">
<span>服务器端</span>
<span>Linux/Unix</span>
<span>Hadoop</span>
<span>Scala</span>
</div>
<div class="li_b_r">“快速发展,人工智能,大数据,待遇好”</div>
</div>
5、编写getData方法,获取职位名、薪资等重要数据
def getData(items):
datalist=[]
for item in items.items():
temp = dict()
temp['职位名']= item.attr('data-positionname')
temp['薪资']= item.attr('data-salary')
temp['公司名']= item.attr('data-company')
temp['公司描述']=pq.PyQuery(item).find(".industry").text()
temp['工作经验']=pq.PyQuery(item).find(".p_bot>.li_b_l").remove(".money").text()
datalist.append(temp)
return datalist
6、完整代码
# coding=utf-8
from selenium import webdriver #模拟真人操作网页
import pyquery as pq #解析网页
import time #时间插件
import os #文件模块
path = os.getcwd()
driver = webdriver.Chrome(executable_path=(path+"/chromedriver"))
# 等待整个页面加载完成再执行下一步
driver.implicitly_wait(5)
print("开始爬取数据")
#网址
lagou_http = "https://www.lagou.com/jobs/list_Ruby/p-city_0?px=default&gx=%E5%85%A8%E8%81%8C&gj=&isSchoolJob=1#filterBox"
#定义一个空列表保存查出来的数据
data = []
driver.get(lagou_http)
def getData(items):
datalist=[]
for item in items.items():
temp = dict()
temp['职位名']= item.attr('data-positionname')
temp['薪资范围']= item.attr('data-salary')
temp['公司名']= item.attr('data-company')
temp['公司描述']=pq.PyQuery(item).find(".industry").text()
temp['工作经验']=pq.PyQuery(item).find(".p_bot>.li_b_l").remove(".money").text()
datalist.append(temp)
return datalist
while True:
# 找到下一页按钮
next_html = driver.find_element_by_css_selector(".pager_next").get_attribute('class')
if next_html == 'pager_next ':
# 获取到的网页数据
items = pq.PyQuery(driver.page_source).find(".con_list_item")
# print(items)
data += getData(items)
time.sleep(2)
# 点击下一页按钮
driver.find_element_by_xpath("//span[@action='next']").click()
else:
print('数据爬取结束')
print(data)
break
# 最后将获取到的数据保存到a.txt文件中
file = open(path+"/a.txt","w")
file.write(str(data))
print('写入文件成功')