博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Python写一个小爬虫吧!
阅读量:6852 次
发布时间:2019-06-26

本文共 4205 字,大约阅读时间需要 14 分钟。

学习了一段时间的web前端,感觉有点看不清前进的方向,于是就写了一个小爬虫,爬了51job上前端相关的岗位,看看招聘方对技术方面的需求,再有针对性的学习。

我在此之前接触过Python,也写过一些小脚本,于是决定用Python来完成这个小项目。

首先说说一个爬虫的组成部分:

1.目标连接,就是我需要爬取信息的网页的链接;

2.目标信息,就是网页上我需要抓取的信息;

3.信息梳理,就是对爬取的信息进行整理。

下面我来说说整个爬虫的设计思路:

总体思路:以“前端”关键字进行搜索,把搜索结果上面每一个招聘信息的链接爬取下来,再通过这些招聘职位的链接去抓取相应页面上的具体要求。

1.先在51job上以“前端”为关键字进行搜索,从搜索结果来看,跟我的目标职位相似度还是很高的,所以用“前端”作为关键字是没问题的。

2.获取搜索结果的链接,通过比较1,2两页的链接,发现只有一个数字的差别,所以我可以直接更改这个数字来获取每一页的链接

3.在搜索结果页面按F12可以看到网页结构,按下左上角的鼠标按钮,再去点网页上的元素,网页结构会自动展现相应的标签

 

 

4.按下左上角的鼠标按钮,再去点招聘信息的岗位链接,可以在网页结构中看到,我们需要的每一个岗位的具体链接是放在一个a标签里面的

5.再点进这个职位的详情页面,按F12查看网页结构,再按左上角鼠标按钮,之后点击网页上的职位信息,我发现职位信息都是放在一个div标签里面,这个div有一个样式类属性class="bmsg job_msg inbox",具体的信息是放在这个div下的p标签中,我查看了其他几个招聘页面,也是相同的结构

 

所以我的爬虫要先爬取搜索结果页面中的职位链接,再进到相应的链接爬取div标签下p标签的内容,最后对这些内容做一个词频分析。

 

为了简化这个小项目的结构,我决定把这3个任务分成3个小脚本来执行。

首先是爬取搜索结果页面中的职位链接。代码如下

1 #爬取职位链接这一步用到了3个库 2 import requests 3 from bs4 import BeautifulSoup 4 import chardet 5  6 f = open('info.txt', 'a') # f是我存储爬取信息的文本文件,使用追加模式,就是说后面写入的信息会放在已有的信息后面,这样就不会把之前的信息覆盖掉 7 url = 'https://search.51job.com/list/020000,000000,0000,00,9,99,%25E5%2589%258D%25E7%25AB%25AF,2,{}.html?' \ 8       'lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&' \ 9       'lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=4&dibiaoid=0&address=&line=&' \10       'specialarea=00&from=&welfare=#top' # url里面关乎页面跳转的数字我用{}占位,后面可以通过format函数动态替换11 header = {12     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 '13                   'Safari/537.36',14     'Connection': 'keep-alive',15     }# header是为了把爬虫伪装的像是正常的访问。16 17 #for循环结构,循环10次,也就是说爬取10页上面的职位链接18 for i in range(11):19   # 用requests库的get方法与服务器进行链接,返回一个requests.models.Response的类20     pageConnect = requests.get(url.format(i), headers=header)21   #用chardet库的detect方法获取网页编码格式,返回的是dict字典,具体的编码格式在encoding这个键对应的值中22     pageConnect.encoding = chardet.detect(pageConnect.content)['encoding']23   #设置好编码格式后,用text方法把Response这个类转化为字符串供beautifulSoup处理24     page = pageConnect.text25   #使用BeautifulSoup函数把page字符串转化为一个BeautifulSoup对象,lxml是解析器的类型26     soup = BeautifulSoup(page, 'lxml')27   #使用BeautifulSoup对象的select方法,可以用css选择器把存放有职位链接的a标签选出来28   #每一个a标签都是放在class=el的div标签下class=t1的p标签下29     aLabel = soup.select('div.el > p.t1 a')30   #每一个搜索结果页有50个职位,也就有50个a标签,通过for循环,获取每个a标签的title属性,href属性31   #title属性存放了职位名称,我可以通过职位名称把不是我需要的职位链接筛选出去32   #href属性存放了每一个职位的链接33     for each in aLabel:34       #把这些信息存放到f也就是info.txt这个文本中35         print(each['title'], each['href'], file=f)

 

接着要做的就是爬取每一个链接页面上的职位要求了

代码如下

1  import requests 2  from bs4 import BeautifulSoup 3  import chardet 4  5  #打开我存放链接的文本,使用readlines方法读取文本内容,返回的是一个list列表,每一行为列表中的一项 6  with open('info.txt') as info: 7      link = info.readlines() 8  #打开一个文本文件,存放抓取到的职位要求,编码格式设为utf-8 9  job = open('job.txt', 'a', encoding='UTF-8')10  header = {11      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 '12                    'Safari/537.36',13      'Connection': 'keep-alive',14      }15  16  for each in link:17    #info.txt中存放的信息是职位名 + 链接:Web前端开发工程师 https://*****  18    #所以先对列表中的每一项,也就是说一个字符串调用find方法,搜索关键字http,返回的是一个整数,表示的是字符串中http开头h的索引值19      index = each.find('http')20    #利用这个索引值,可以获取字符串中链接的部分21      url = each[index:]22      pageConnect = requests.get(url, headers=header)23      pageConnect.encoding = chardet.detect(pageConnect.content)['encoding']24      page = pageConnect.text25      soup = BeautifulSoup(page, 'lxml')26    #所有的职位要求是放在一个div中,它的样式类为class=bmsg job_msg inbox,div中的p标签包含具体的信息,返回的是一个list列表27      div = soup.select('div.bmsg.job_msg.inbox p')28    #经过测试发现,最后2个p标签存放着关键字,所以去掉29      jobInfo = div[:-2]30      for eachInfo in jobInfo:31      #每个列表项存放着如

***

的bs4.element.Tag,要获取其中文字部分,要使用.string方法32   print(eachInfo.string, file=job)

 

最后job.txt中存放着我抓取到的所有职位要求,但是我不可能一条一条的去看,所以借助jieba这个库进行分词

1 import jieba2 3 with open('job.txt', encoding='utf-8') as job:4     info = job.readlines()5 for eachLine in info:6     for eachWord in jieba.cut(eachLine):7         print(eachWord)

 

为了节省时间,分词结果直接打印出来,然后复制到excel表中,使用数据透视表统计一下,最后整理结果如下

这是一个非常简陋的小项目,不过它也实现了我的目标。

 

转载于:https://www.cnblogs.com/KlllB/p/9626794.html

你可能感兴趣的文章
iptables中DNAT、SNAT和MASQUERADE的作用
查看>>
kvm命令学习记录
查看>>
小菜鸡进阶之路-First week
查看>>
ORACLE 10g SYSAUX表空间快速增长之WRH$_ACTIVE_SESSION_HISTORY篇
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
子数组的和的最大值(包括升级版的首尾相连数组)
查看>>
LeetCode - Nth Highest Salary
查看>>
9.ORM数据访问
查看>>
在RHEL5下搭建SSH远程登录服务器
查看>>
使用Moblin SDK开发应用程序 -- Image Creator
查看>>
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记14 视图绘制Demo
查看>>
/dev/null &
查看>>
在Ubuntu上安装Node.js的Upstream版本
查看>>
扩展GridView控件(8) - 导出数据源的数据为Excel、Word或Text
查看>>
CISCO路由器配置基础(3)
查看>>
linux下通过串口登陆交换机
查看>>
微信公众平台群发规则说明
查看>>
LINUX下直接使用ISO文件
查看>>
第四章 apache的工作模式
查看>>