朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

拉勾网热门职业爬虫

in Python3 read (646) 505汉字 站长Lucifaer 文章转载请注明来源!

上上周吧,学测控的发小私我,让我帮他写个爬虫,完成他们的作业(现在都没想通为啥学测控的要写爬虫....)。爬的是拉勾网所有和数据挖掘职业相关的信息,包括职业名称,要求,职业诱惑,工作地址。

我登上去看了看,发现是爬取深度为2的爬虫,随手写了个demo,然后就被ban了...

然后发小跟我说第二天就要交...

思路

爆发前

一般来说,ip被ban这种情况很正常,通常是设置sleep或者设置代理池来解决。

通过测试我把sleep的时间设置为5s,就没有被ban的风险了。

当我兴高采烈的爬取完30页的资源后,我...又被ban了...

怒了过后

然后我一怒之下用了最低效暴力的方法,把他所有的网页全爬下来,保存成本地文件(这也就是为啥这爬虫效率这么低的原因之一,但是贵在稳定)。然后处理爬虫第一遍爬下来的数据,进行第二次爬取。(怪我懒,没设置多线程,这个是爬取效率低的原因之二)。

代码

from bs4 import BeautifulSoup
import requests as rq
import os
import time

'''
爬取代理池
'''
proxies = {
    'http': '182.139.160.254:9999',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
}
links = []
target_links = []# 爬取链接
job_name = []   # 工作名称
job_request = []    # 工作要求
job_test_request = []
job_advantage = []  # 职位诱惑
job_address = []    # 工作地址
job_test_address = []
filename = []

# 创建目录
if not os.path.exists('./sites'):
    os.mkdir("sites")

# 设置要爬取的30页内容
for i in range(1, 31):
    url = "https://www.lagou.com/zhaopin/shujuwajue/"+str(i)+"/?filterOption=3"
    links.append(url)

# 将30页的内容爬取下来
for i in range(0, 30):
    target_page = rq.get(links[i], proxies=proxies, headers=headers)
    time.sleep(5)
    if os.path.exists('./sites/url'+str(i+1)+'.html'):
        continue
    else:
        with open('./sites/url'+str(i+1)+'.html', 'wt') as f:
            f.write(target_page.text)

# 将30页中每页的职位链接爬取下来
for i in range(0, 30):
    with open('./sites/url' + str(i+1) + '.html', 'rt') as f:
        target = f.read()
        target_soup = BeautifulSoup(target, 'lxml')
        target_div = target_soup.find_all("a", {'class': 'position_link'})
        if len(target_div)>0:
            for i in range(0, len(target_div)):
                target_links.append(target_div[i].get('href'))

# 将450个职业链接的内容页面爬取下来
for i in range(0, len(target_links)):
    job_url = rq.get(target_links[i], proxies=proxies, headers=headers)
    time.sleep(5)
    if os.path.exists('./sites/url'+str((i//15)+1)+'-'+str(i%15+1)+'.html'):
        continue
    else:
        with open('./sites/url'+str((i//15)+1)+'-'+str(i%15+1)+'.html', 'wt') as f:
            f.write(job_url.text)

# 将职业链接文件名加入列表中
for i in range(0, 30):
    for j in range(0, 15):
        filename.append('./sites/url'+str(i+1)+'-'+str(j+1)+'.html')

# 处理爬取下来的内容
for file in filename:
    with open(file, 'rt') as f:
        job = f.read()
        job_soup = BeautifulSoup(job, 'lxml')
        # 工作名称
        job_name_div = job_soup.find_all("div", {'class': 'job-name'})
        job_name.append(job_name_div[0].get('title'))
        #print(job_name)

        # 工作要求
        job_request_div = job_soup.find_all("dd", {'class': 'job_request'})
        #print(job_request_div[0].span.next_siblings)
        for string in job_request_div[0].span.next_siblings:
            job_test_request.append((string.string).strip())
        #job_trim_request = job_request[1]+job_request[3]+job_request[5]+job_request[7]
        job_trim_request = ''.join(job_test_request)
        job_test_request = []
        job_request.append(job_trim_request)
        #print(job_request)

        # 职位要求
        job_advantage_div = job_soup.find_all("dd", {'class': 'job-advantage'})
        job_advantage.append(job_advantage_div[0].p.string)
        #print(job_advantage)
        #print(job_advantage_div[0].p.string)

        # 工作地址
        job_address_div = job_soup.find_all("div", {'class': 'work_addr'})
        #print(job_address_div[0].a.strings)
        for string in job_address_div[0].a.next_siblings:
            job_test_address.append((string.string).strip())
        job_trim_address = (''.join(job_test_address))[:-4]
        job_test_address = []
        job_address.append(job_trim_address)
        #print(''.join(job_address))
        #print(job_address[2])

# 将整理后的数据格式化输出
for i in range(0, len(job_name)):
    print("工作名称:"+job_name[i]+"\t")
    print("工作要求:"+job_request[i]+"\t")
    print("职位要求:"+job_advantage[i]+"\t")
    print("工作地址:"+job_address[i]+"\n")

没用数据库(发小不会....),处理起来比较麻瓜。效果如下:

爬虫还是蛮简单的,修改一下,加一个多线程,加一个入库,差不都就能非常舒服的来管理这些信息了。

爬虫
最后由Lucifaer修改于2017-06-25 22:16

此处评论已关闭

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆