使用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(</span>2<span style="color: rgba(0, 0, 0, 1)">) input.send_keys(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">JAVA</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) sleep(</span>2<span style="color: rgba(0, 0, 0, 1)">) submit.click() </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> TimeoutException: </span><span style="color: rgba(0, 0, 255, 1)">return</span> self.search()</pre>
定义获取下一页的方法
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) </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(len(self.list)) sleep(</span>2<span style="color: rgba(0, 0, 0, 1)">) self.next_page()</span></pre>
最后创建一个 config.py,MONGODB 的配置
MONGO_URL ='localhost' MONGO_DB = 'lagou' MONGO_COLLECTION='java'
在 lagou.py 文件中写上
from config import * import pymongoclient = 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 数据库
已经成功爬取啦