Python爬虫案例2:爬取前程无忧网站数据

1  爬虫技术介绍

        Python中有许多模块可以用于编写爬虫程序,常用的有urllib2requestsselenium模块等,本文选取的是selenium模块,selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。选取其是基于以下原因:selenium模块本质是通过驱动浏览器、完全模拟浏览器的操作,配合使用随机延时操作,在保证被爬取页面完全加载以确保爬虫程序正常运行的同时,最大限度地模仿用户的行为,从而避免被网站识别为爬虫;selenium可以处理JavaScript渲染的网页,避免了其他爬虫方式如requests因为无法处理JavaScript而导致的数据缺失或错误。

2   爬虫策略

        前期解析网页和内容之后需要设计爬虫策略开始爬取数据,前程无忧网站每页显示的招聘信息量为50条,本文爬取数据时设计爬取的页面数量为200页,也就是一万条数据,为了模拟用户的行为,采用for循环遍历待爬取的每一个页面,并用程序控制在侧边滚动条上以50像素滑动一次的速度浏览页面。因目标页数较多,翻页时采用输入页码然后点击跳转的方式,避免了在for循环范围内页面突然结束的情况。

        第二大步即是对爬取的HTML文件进行解析,并将数据取出存储为excel文件,便于后续的数据预处理和可视化分析。由于爬取的数据是半结构化数据,因此要使用beautifulsoup、lxml等包对数据进行解析,本文选取的是lxml,lxml是python的一个解析库,支持HTML和XML解析,同时支持XPath(XML Path Language)解析方式。Lxml的解析速率相较BeautifulSoup更高,虽然后者学习相较更简单。

3  爬虫代码

from selenium import webdriver
from selenium.webdriver import ChromeOptions
from time import sleep
import random
from selenium.webdriver.common.by import By


def main():
    for p in range(200):
        p += 1
        print(f'爬取第{p}页')
        sleep(5 * random.random())
        for i in range(140):
            sleep(random.random()/5)
            driver.execute_script('window.scrollBy(0,50)')
        res = driver.page_source
        open(f'html/{p}.html','w',encoding='utf-8').write(res)
        if p != 200:
            driver.find_element(By.ID,'jump_page').clear()
            driver.find_element(By.ID,'jump_page').send_keys(p + 1)
            sleep(random.random())
            button2 = driver.find_element(By.CLASS_NAME,'jumpPage')
            driver.execute_script("arguments[0].click();", button2)


if __name__ == '__main__':
    options = ChromeOptions()
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = webdriver.Chrome(options=options)
    js = open('stealth.min.js').read()
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':js})
    driver.get('https://we.51job.com/pc/search?keyword=&searchType=2&sortType=0&metro=')
    sleep(5)
    input = driver.find_element(By.ID,'keywordInput')
    input.send_keys('电商')
    button1 = driver.find_element(By.ID, 'search_btn')
    driver.execute_script("arguments[0].click();", button1)
    sleep(5)
    main()
    driver.quit()

4  爬虫解析代码

from lxml import etree
import pandas as pd


def collect():
    resls = []
    for i in range(200):
        i += 1
        res = open(f'html/{i}.html',encoding='utf-8').read()
        tree = etree.HTML(res)
        for li in tree.xpath('.//div[@class="j_joblist"]/div'):
            name = li.xpath('.//span[@class="jname at"]/text()')[0]
            href = li.xpath('./a/@href')[0]
            time = li.xpath('.//span[@class="time"]/text()')[0]
            sala = (li.xpath('.//span[@class="sal"]/text()') + [''])[0]
            addr = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[0]
            exp = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[2]
            edu = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[4]
            comp = li.xpath('.//a[@class="cname at"]/text()')[0]
            kind = li.xpath('.//p[@class="dc at"]/text()')[0].split('|')[0].strip()
            num = (li.xpath('.//p[@class="dc at"]/text()')[0].split('|') + [''])[1].strip()
            ind = (li.xpath('.//p[@class="int at"]/text()') + [''])[0]
            dic = {
                '职位': name,
                '链接': href,
                '时间': time,
                '薪资': sala,
                '地区': addr,
                '经验': exp,
                '学历': edu,
                '公司': comp,
                '类型': kind,
                '规模': num,
                '行业': ind
            }
            print(dic)
            resls.append(dic)
    pd.DataFrame(resls).to_excel('前程无忧电商数据.xlsx', index=False, encoding='utf-8')


if __name__ == '__main__':
    collect()

5  数据采集结果

        爬取数据的部分截图如图所示,数据包含职位名称、链接、发布时间、薪资、地区、经验要求、学历要求、公司名称、类型、规模、所属行业11个字段。

        相关代码文件和爬取的前程无忧网页数据excel文件(共计1万条数据)已上传至资源,需要者自取即可。

        ps:各种网站为了反爬虫会时常更新网页代码,同一个网页可能不到一个月爬虫代码就爬不了了,所以大家最重要的是学习爬虫技术,一边根据网页自己调整代码。

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值