python爬虫selenium---Boss直聘

         爬虫初衷是为了练习python爬虫和数据的收集及分析能力,内容均为网站用户可访问到的内容,不涉及隐私。(爬了两份数据,一个是设计师岗位,一个是python岗位)

爬虫过程

1.爬虫内容始终为正在加载     

由于Boss直聘是动态网页,所以需要先观察网站规律,网址组成为  url+搜索关键词+页码  ,分析网页之后开始爬虫,最开始用的requests.get直接请求,但发现不管我换哪个网址,获取到的内容始终是正在加载中,后来发现是没有带cookies数据的原因,爬虫任何网站一定要记得带上cookies(本地的用户数据),proxies(代理ip)和headers(请求头,包装为浏览器)

2.Boss直聘的反爬虫机制

在加入了cookies数据之后,想要爬取的内容终于爬到了,但是只能运行出来几条数据,一开始一开始怀疑是这个cookies可能失效了的缘故,在我接连换了几次cookies之后,得到的结果仍然没有改变,在朋友的帮助点拨下,我尝试selenium,并加入了一些延时time.sleep。

3.Boss直聘首页的xpath标签与后面的存在差异

python爬虫selenium---Boss直聘_第1张图片

 上面这个标签是Boss直聘搜索界面第一页特有的标签,我的处理办法是把第一页的爬虫单独拎出来,循环爬虫是从第2页开始,如果读者有好的想法可以探讨。

4.想要爬取到全部数据,必须登录Boss直聘账号

爬虫运行一半报错,原因是selenium操纵谷歌会重新打开一个谷歌界面,里面没有我的账号信息,也就是我在观察网页规律时登录了账号,爬虫程序运行时账号没有登录,导致在爬取到第8页时程序报错,即没有登陆的用户只能看到8页数据

我的处理办法是用selenium操纵浏览器到扫描登陆二维码的位置,之后打开手机APP手动扫码,登陆成功(之前去网上查了有的说这里可以全自动,即破解验证码或者滑块等,但看了一些csdn文章之后感觉没太看懂,代码行数也比较多,如果读者有好的想法可以探讨)。

在成功登录之后,剩下的爬取内容就让代码自动运行输出就好了。。。。。

整体思路:

观察网站规律--selenium控制浏览器登录网站--find_element_by_xpath定位标签信息--整理输出到mongodb。

 最后一定要谨记不能使用自己常用的账号登录爬取,不让就会和博主一样

python爬虫selenium---Boss直聘_第2张图片

源代码

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('运行完毕')

你可能感兴趣的:(python,selenium,xpath)