由于Boss直聘是动态网页,所以需要先观察网站规律,网址组成为 url+搜索关键词+页码 ,分析网页之后开始爬虫,最开始用的requests.get直接请求,但发现不管我换哪个网址,获取到的内容始终是正在加载中,后来发现是没有带cookies数据的原因,爬虫任何网站一定要记得带上cookies(本地的用户数据),proxies(代理ip)和headers(请求头,包装为浏览器)
在加入了cookies数据之后,想要爬取的内容终于爬到了,但是只能运行出来几条数据,一开始一开始怀疑是这个cookies可能失效了的缘故,在我接连换了几次cookies之后,得到的结果仍然没有改变,在朋友的帮助点拨下,我尝试selenium,并加入了一些延时time.sleep。
上面这个标签是Boss直聘搜索界面第一页特有的标签,我的处理办法是把第一页的爬虫单独拎出来,循环爬虫是从第2页开始,如果读者有好的想法可以探讨。
爬虫运行一半报错,原因是selenium操纵谷歌会重新打开一个谷歌界面,里面没有我的账号信息,也就是我在观察网页规律时登录了账号,爬虫程序运行时账号没有登录,导致在爬取到第8页时程序报错,即没有登陆的用户只能看到8页数据
我的处理办法是用selenium操纵浏览器到扫描登陆二维码的位置,之后打开手机APP手动扫码,登陆成功(之前去网上查了有的说这里可以全自动,即破解验证码或者滑块等,但看了一些csdn文章之后感觉没太看懂,代码行数也比较多,如果读者有好的想法可以探讨)。
在成功登录之后,剩下的爬取内容就让代码自动运行输出就好了。。。。。
观察网站规律--selenium控制浏览器登录网站--find_element_by_xpath定位标签信息--整理输出到mongodb。
最后一定要谨记不能使用自己常用的账号登录爬取,不让就会和博主一样
import time
import requests
import json
from lxml import etree
import pandas as pd
import pymongo
from selenium import webdriver
dict_list=[]
position_list=[]
location_list=[]
money_list=[]
company_list=[]
company_welfare_list=[]
management_list=[]
exp_list=[]
detailed_url_list=[]
browser=webdriver.Chrome()
for j in range(1,11):
url='https://www.zhipin.com/c101040100/e_102/?query=python&page={}&ka=page-{}'.format(j,j)
browser.get(url)
time.sleep(5)
if j==1:
browser.find_element_by_xpath('//*[@id="header"]/div[1]/div[3]/div/a[5]').click()
time.sleep(2)
browser.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div[2]').click()
time.sleep(5)
input=browser.find_element_by_xpath('//*[@id="container"]/div[2]/div/div[1]/div/div[2]/div/div[1]/input')
input.click()
input.send_keys('python')
time.sleep(2)
browser.find_element_by_xpath('//*[@id="container"]/div[2]/div/div[1]/div/div[2]/div/div[2]/ul/li[1]').click()
time.sleep(3)
for i in range(1,31):
position=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[1]/a'.format(i)).text
location=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[2]/span'.format(i)).text
time.sleep(1)
money=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[1]/div/div[2]/span'.format(i)).text
company=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[2]/div/h3/a'.format(i)).text
time.sleep(1.5)
company_welfare=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[2]/div[2]'.format(i)).text
management=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[2]/div/p/a'.format(i)).text
time.sleep(1)
exp=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[1]/div/div[2]/p'.format(i)).text
detailed_url=browser.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[1]/a'.format(i)).get_attribute('href')
dict={'公司名称':company,'职位':position,'薪资待遇':money,'公司福利':company_welfare,'公司地点':location,'经营方向':management,'经验要求':exp,'联系它们网页':detailed_url}
dict_list.append(dict)
position_list.append(position)
location_list.append(location)
money_list.append(money)
company_list.append(company)
company_welfare_list.append(company_welfare)
management_list.append(management)
exp_list.append(exp)
detailed_url_list.append(detailed_url)
time.sleep(1)
print(dict_list)
print('第一页爬取完毕')
else:
for i in range(1,31):
position=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[1]/a'.format(i)).text
location=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[2]/span'.format(i)).text
time.sleep(1)
money=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[1]/div/div[2]/span'.format(i)).text
company=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[2]/div/h3/a'.format(i)).text
time.sleep(1.5)
company_welfare=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[2]/div[2]'.format(i)).text
management=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[2]/div/p/a'.format(i)).text
time.sleep(1)
exp=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[1]/div/div[2]/p'.format(i)).text
detailed_url=browser.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/div[1]/div/div[1]/span[1]/a'.format(i)).get_attribute('href')
#detailed_url = re.search(r'\w+\W\w+\.\w+', str(detailed_url)).group(0)
#detailed_url = 'www.zhipin.com/' + detailed_url
dict={'公司名称':company,'职位':position,'薪资待遇':money,'公司福利':company_welfare,'公司地点':location,'经营方向':management,'经验要求':exp,'联系它们网页':detailed_url}
dict_list.append(dict)
position_list.append(position)
location_list.append(location)
money_list.append(money)
company_list.append(company)
company_welfare_list.append(company_welfare)
management_list.append(management)
exp_list.append(exp)
detailed_url_list.append(detailed_url)
time.sleep(1)
print(dict_list)
print('第{}页爬取完毕'.format(j))
dict2={'公司名称':company_list,'职位':position_list,'薪资待遇':money_list,'公司福利':company_welfare_list,'公司地点':location_list,'经营方向':management_list,'经验要求':exp_list,'联系它们网页':detailed_url_list}
dt=pd.DataFrame(dict2)
dt.to_csv(r'C:\Users\asus\Desktop\boss直聘python.csv',mode='w')
client=pymongo.MongoClient('mongodb://localhost:27017/')#链接mongodb数据库
db=client['boss直聘python']#创建数据库
db.collection.insert_one(dict2)#数据库中插入字典型数据dict2
print('运行完毕')