码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-05-27 13:10:47      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:host   请求   声明   mon   comm   spider   form   工作   mongdb   

开始这个小项目的时候要确保你的电脑中有装上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数据库

 技术图片

已经成功爬取啦

 

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

标签:host   请求   声明   mon   comm   spider   form   工作   mongdb   

原文地址:https://www.cnblogs.com/ouyangbo/p/10930076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!