Scrapy实战之获取腾讯招聘信
每年7月都有人毕业,每年7月都有人离开学校走上工作岗位。
或是为了混口饭吃,或是为了祖国繁荣富强,他们从学校散布到世界各地,像蒲公英般飘落到各行各业,默默地为祖国散发着光和热。
当然也有人还在四处投递简历,寻找工作,忙的焦头烂额。
莫慌!小叮当这就带你使用Scrapy爬取海量腾讯招聘信息。
Scrapy实战获取腾讯招聘信息
(1)分析目标网页
由于在”小叮当高级爬虫(三):scrapy shell命令行模式“中已经分析过目标网页,且测试了提取数据的xpath表达式,这里就不再赘述。
(2)创建scrapy项目
在cmd窗口中输入命令:scrapy startproject tencent_recruit 创建一个名为tencent_recruit的scrapy项目。
在tecent_recruit文件夹下找到spiders文件夹,在此处打开cmd窗口输入命令:scrapy genspider catch_positon tencent.com 创建名为“catch_positon"的爬虫文件。
(3)明确爬取目标
我们在pycharm中打开刚才创建好的"tencent_recruit"项目。使用“Alt+1"组合键打开项目视图,找到items.py文件,双击进入。
根据目标网页,我们来确定爬取的目标为“职位名称”、“职位详情连接”、“职位类型”、“招聘人数”、“工作地点”、“发布时间”。
据此,我们来编写“items.py”确定爬取目标。
(4)编写爬虫文件
双击我们创建好的“catch_positon.py”,来编写爬虫文件。
首先更改“start_urls"字段值为我们的目标网址。
在”settings.py"中将第22行(pycharm中为第22行,不同编辑器可能行数不同)的“ROBOTSTXT_OBEY”协议前加“#“进行注释。
将第19行(pycharm中为第19行,不同编辑器可能行数不同)的”USER_AGENT“前的”#“注释去掉,将其值改为浏览器中用F12看到的值。
我们根据上次在“小叮当高级爬虫(三):scrapy shell命令行模式”中测试过的xpath来编写爬虫文件。
在cmd命令行中输入:scrapy crawl catch_positon运行爬虫进行测试。
和网址上的信息对比后,发现我们已经成功提取到数据,测试成功。
可见我们提取到的每行数据列表中只有1个数据,因此我们使用”extract_first()"表示取第一个元素。
注意:"extract()[0]"和“extract_first()"均可取到第一个元素,一旦没有数据时,”extract()[0]“会报错小标范围溢出终止程序运行,而“extract_first()"则会直接返回”null"表示空值,不会打断程序运行,因此,我们在取第一个元素时,我们常用”extract_first()"。
我们导入相应的item类:from tencent_recruit.items import TencentRecruitItem
将item类实例化,将相应数据赋值给相应的item中。
在cmd命令行中输入:scrapy crawl catch_positon 运行爬虫进行测试。
可见,我们已经成功提取了“腾讯招聘”网的第一页数据。下面,我们来分析网页,爬取全部招聘信息。
我们按下F12,点击选择元素,选中“下一页”,便可以看到浏览器为我们自动定位的相应网页代码。
我们点击代码中对应的a标签链接,发现直接就来到了第二页。
我们根据这个规律,便可得出爬取全部招聘信息的思路:提取每一页的“下一页链接”,
提取网页数据,
根据“基础网址”和“下一页链接”构造出新的访问请求。
(5)编写管道文件,存储数据
双击“pipelines.py",进入管道文件,进行编写。
为将我们的数据存储为json格式,使用命令”import json"导入json包。
定义打开爬虫函数“open_spider”在执行爬虫时创建对应的数据存储文件。
定义“process_item”函数,将返回给管道的item数据存储为json格式。
定义关闭爬虫函数“close_spider”,在爬虫结束时关闭文件。
最后,到“settings.py"中注册管道,找到67行(pycharm中为第67行,不同编辑器可能行数不同),将
“ITEM_PIPELINES”对应部分的“#”注释去掉。
在cmd命令行中输入:scrapy crawl catch_positon 运行爬虫,爬取全部腾讯招聘信息。
我们可以看到数据一直在被抓取。大约两分钟后,程序运行结束。我们可以看到,在spiders文件夹下多了一个我们用管道文件创建的“tencent_recruit.json"文件。
我们双击”tencent_recruit.json“文件打开,用鼠标将滚动条拉倒最后,可以看到我们共抓取了3706条数据。和腾讯招聘官网上的总职位数3706相符。