使用selenium动态渲染爬取拉勾网上450个java职位的信息

开始这个小项目的时候要确保你的电脑中有装上selenium以及相应的浏览器驱动,还有别忘了Mongodb数据库

我们首先打开拉勾网的官网查看下基本的页面元素

当我在搜索框中输入java的时候,url如下,当我想用下面的url进行抓取的时候,我发现事情并不简单。

我点击下一页的时候发现,url并没有变化,所以并不能用最基本的抓取方法了,而改为ajax请求进行抓取

当我查看ajax请求的时候,发现事情又不简单的了,这个分页的请求带的参数时Form data,也就是表单形式的参数,

所以,拉勾网上的ajax请求不是get请求,不能再url里面直接带参数了,而是post请求

所以用ajax的请求方式也是不能顺利的抓取的,至少对于我这个新手来说

所以我决定采取Selenium动态渲染的方式进行抓取

确定基本的抓取方式之后我们就可以开始工作啦!

 首先导入必备的包

from time import sleep
from pyquery import PyQuery as pq
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException

创建一个lagou.py文件,声明一个LagouSpider类,并且定义它的init方法

class LagouSpider(object):
    def __init__(self):
        self.url = 'https://www.lagou.com/'
        self.browser = webdriver.Chrome()
        self.browser.set_window_size(1920, 1080)
        self.wait = WebDriverWait(self.browser,20)
        self.list=[]

定义搜索的方法

    def search(self):
        try:
            self.browser.get(self.url)
            actions = ActionChains(self.browser)
            actions.click()
            actions.perform()
            input = WebDriverWait(self.browser, 10).until(
                EC.presence_of_element_located((By.ID,'search_input'))
            )
            submit = WebDriverWait(self.browser,10).until(
                EC.element_to_be_clickable((By.ID,'search_button'))
            )

            sleep(2)
            input.send_keys('JAVA')
            sleep(2)
            submit.click()
        except TimeoutException:
            return self.search()

定义获取下一页的方法

    def next_page(self):
        try:
            next = WebDriverWait(self.browser,10).until(
                EC.element_to_be_clickable((By.CLASS_NAME,'pager_next '))
            )
            next.click()
        except TimeoutException:
            self.next_page()

获取我要爬取的数据,包括职位,工资,职位的需求

#获取数据以及对数据进行清洗
    def get_salary(self):
        html = self.browser.page_source
        doc = pq(html)
        items = doc('.list_item_top').items()
        for item in items:
            java_dict={
                'position':item.find('.p_top .position_link h3').text(),
                'salary':item.find('.p_bot .li_b_l').text().split(' ',1)[0],
                'qualification':item.find('.p_bot .li_b_l').text().split(' ',1)[1]
            }
            print(java_dict)
            self.list.append(java_dict)

            self.save_data(java_dict)
        print(len(self.list))
        sleep(2)

        self.next_page()

最后创建一个config.py,MONGODB的配置

MONGO_URL ='localhost'
MONGO_DB = 'lagou'
MONGO_COLLECTION='java'

在lagou.py文件中写上

from config import *
import pymongo


client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

在LagouSpider中,保存到MONGODB数据库中

#保存到MONGDB中
    def save_data(self,result):
        try:
            if db[MONGO_COLLECTION].insert(result):
                print('存储到MONGODB成功')
        except Exception:
            print('存储到MONGODB失败')

创建统筹调用的方法

    def main(self):
        self.search()
        for i in range(1,31):
            self.get_salary()

最后开始爬取啦

LagouSpider().main()

查看MONGODB数据库

 

已经成功爬取啦

猜你喜欢

转载自www.cnblogs.com/ouyangbo/p/10930076.html