爬取招聘网站

# coding: utf-8

import requests
import re
import xlwt



class ZLZP(object):

'''
http://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京%2B上海%2B广州%2B深圳%2B杭州&kw=python
'''

def __init__(self):
    self.html = ''
    self.nextLink =''
    self.filename = ''
    # 准备请求头
    self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'}
    self.result_data = []

# 根据url获取html源代码
def get_html(self):
    # 携带请求头
    response = requests.get(self.nextLink, headers=self.headers)
    self.html = response.content

# 获取搜索职位首页的url地址
def get_index_url(self):
    # 把kw添加为对象的属性
    self.kw = raw_input('请输入要爬取的职位名称:')
    city_list = []
    # 输入查询的城市,最多输入五个
    while len(city_list) < 5:
        city = raw_input('请输入要查询的城市(最多5个,输入0结束:):')
        if city == '0':
            break
        city_list.append(city)
    # 可以把列表中的每一条数据使用字符串隔开,最终返回一个字符串
    citys = '%2B'.join(city_list)
    # 拼接第一页的url地址,并赋值给nextLink
    self.nextLink = 'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%s&kw=%s' % (citys, self.kw)

# 获取下一页的链接
def get_nextLink(self):
    pattern = re.compile(r'<li class="pagesDown.*?<a.*?href="(.*?)" class="next-page">',re.S)
    rs = re.search(pattern, self.html)
    # 如果搜索到结果,说明有下一页的链接
    if rs:
        self.nextLink = rs.group(1)
    else:
        self.nextLink = None

# 获取所有页的数据
def get_result_data(self):
    # 只要有下一页的链接,执行获取数据
    count = 0
    while self.nextLink:
        count += 1
        print '正在爬取第%s页数据.....'%count
        # 获取html源代码
        self.get_html()
        # 准备正则
        pattern = re.compile(r'<table.*?class="newlist.*?<td class="zwmc.*?<a.*?>(.*?)</a>.*?<td class="gsmc.*?<a.*?>(.*?)</a>.*?<td class="zwyx">(.*?)</td>.*?<td class="gzdd">(.*?)</td>',re.S)
        # 根据正则查找数据
        rs = re.findall(pattern, self.html)
        # 把所有的数据添加到大列表中
        self.result_data.append(rs)
        # 获取下一页链接
        self.get_nextLink()

# 保存数据
def save_data(self):
    # 创建工作簿
    workbook = xlwt.Workbook(encoding='utf-8')
    # kw如果是中文需要进行编码
    sheet = workbook.add_sheet(u'%s职位表'%unicode(self.kw, 'utf-8'))
    sheet.write(0, 0, '职位名称')
    sheet.write(0, 1, '公司名称')
    sheet.write(0, 2, '职位月薪(最低)')
    sheet.write(0, 3, '职位月薪(最高)')
    sheet.write(0, 4, '工作地点')
    # 从1行开始写入
    count = 1
    # for循环遍历所有页数据
    for rs in self.result_data:
        for detail in rs:
            # 去除职位名称中的标签
            strip_ele =  re.compile(r'&nbsp;|<.*?>')
            # 取出 职位名称 公司名称 职位月薪  工作地点
            zwmc = re.sub(strip_ele, '', detail[0])
            gsmc = detail[1]
            zwyx = detail[2]
            if '-' in zwyx:
                min_money = zwyx.split('-')[0]
                max_money = zwyx.split('-')[1]
            else:
                min_money = max_money = '面议'
            gzdd = detail[3]
            sheet.write(count, 0,zwmc)
            sheet.write(count, 1,gsmc)
            sheet.write(count, 2,min_money)
            sheet.write(count, 3,max_money)
            sheet.write(count, 4,gzdd)
            # 行号+1
            count += 1
    # 保存
    workbook.save(u'%s职位爬取数据.xls'%unicode(self.kw, 'utf-8'))

# 启动爬虫
def start(self):
    self.get_index_url() # self.nextLink = '搜索网页的url地址'
    self.get_html() # self.html = html网页源代码
    self.get_result_data()
    self.save_data()

zlzp = ZLZP()
zlzp.start()
使用爬虫爬取招聘网站信息可借助不同编程语言实现,以下是Python和Java的实现方法: ### Python 爬虫实现 可基于现代的Python爬虫技术栈,如requests、BeautifulSoup、Scrapy、Selenium等库进行爬取,确保爬取过程高效、稳定,并且能够应对常见的反爬虫机制。爬取步骤一般如下: 1. **发送请求**:使用`requests`库向招聘网站的URL发送HTTP请求,获取网页的响应数据。示例代码如下: ```python import requests url = 'https://example.com' # 替换为实际的招聘网站URL headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url=url, headers=headers) if response.status_code == 200: print("请求成功") print(response.text) # 获取响应体的文本数据(网页源代码) else: print(f"请求失败,状态码: {response.status_code}") ``` 2. **解析数据**:从响应数据中提取所需的职位信息,如职位名称、薪资待遇、公司名称、职位要求、工作地点等。可使用`re`正则表达式、`css`选择器、`xpath`等方法进行解析。示例代码如下: ```python import re # 使用正则表达式提取招聘信息 pattern = r'window.SEARCH_RESULT = (.*?)' result = re.findall(pattern, response.text) if result: print(result[0]) ``` 3. **处理分页**:如果招聘信息分布在多个页面上,需要处理分页逻辑,循环发送请求获取所有页面的数据。 ### Java 爬虫实现 可使用`Jsoup`库来解析HTML文档,提取所需的信息。示例代码如下: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.util.ArrayList; import java.util.List; class Job { private String job; private String salary; private String address; private String companyname; private String require; private String welfare; // Getters and Setters public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCompanyname() { return companyname; } public void setCompanyname(String companyname) { this.companyname = companyname; } public String getRequire() { return require; } public void setRequire(String require) { this.require = require; } public String getWelfare() { return welfare; } public void setWelfare(String welfare) { this.welfare = welfare; } } public class RecruitmentCrawler { private List<Job> list = new ArrayList<>(); public static void main(String[] args) { RecruitmentCrawler crawler = new RecruitmentCrawler(); try { String url = "https://example.com"; // 替换为实际的招聘网站URL String content = Jsoup.connect(url).get().html(); crawler.parseList(Jsoup.parse(content)); for (Job job : crawler.list) { System.out.println(job.getJob() + " - " + job.getSalary()); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private void parseList(Document document) throws InterruptedException { Elements elements = document.getElementsByClass("sojob-item-main clearfix"); for (Element element : elements) { Elements elements1 = element.select("h3"); String job = elements1.attr("title"); Elements elements2 = element.select(".condition"); String all = elements2.attr("title"); String[] a = all.split("_"); String salary = a[0]; String address = a[1]; String require = a[2] + a[3]; Elements elements3 = (element.select(".temptation")).select("span"); String welfare = elements3.text(); // 公司名称 Elements elements4 = (element.select(".company-name")).select("a"); String companyname = elements4.text(); Job jobs = new Job(); // key是字段名 value是字段值 jobs.setJob(job); jobs.setSalary(salary); jobs.setAddress(address); jobs.setCompanyname(companyname); jobs.setRequire(require); jobs.setWelfare(welfare); list.add(jobs); } } } ``` 上述代码通过`Jsoup`库发送HTTP请求,获取招聘网站的HTML内容,并将其解析为`Document`对象。然后,根据网页标签解析源码,提取所需的职位信息,并存储在`Job`对象中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值