这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。 先上一波爬取结果:
日志部分截图
数据库部分截图
import scrapy from urllib import parse from pymongo import MongoClient
scrapy框架安装可以参考前文:Python | Python学习之初识Scrapy
#有虚拟环境的可以先切换到对应的虚拟环境下 #创建scrapy项目 scrapy startproject hrspider #创建scrapy爬虫 scrapy genspider hr https://hr.tencent.com/position.php
分析请求页面 根据上面的分析我们可以很方便的得到下面的代码:
class HrspiderSpider(scrapy.Spider): name = 'hrspider' allowed_domains = ['tencent.com'] start_urls = ['https://hr.tencent.com/position.php'] def parse(self, response): pass
查看页面上我们需要提取的元素,编写对应的xpath路径便于提取数据。代码如下:
def parse(self, response): tr_list = response.xpath("//table[@class='tablelist']/tr")[1:-1] for tr in tr_list: item = TencenthrItem() item["title"] = tr.xpath("./td[1]/a/text()").extract_first() item["position"] = tr.xpath("./td[2]/text()").extract_first() item["num"] = tr.xpath("./td[3]/text()").extract_first() item["location"] = tr.xpath("./td[4]/text()").extract_first() item["publish_date"] = tr.xpath("./td[5]/text()").extract_first() url = tr.xpath("./td[1]/a/@href").extract_first() item["detail_url"] = parse.urljoin(response.url, url) print(item)
成功提取单个页面的元素之后,我们需要不断获取下一页的地址,以便于获取全部的数据,页面分析如下:
翻页分析 根据上图的分析逻辑,我们可以得到完善parse方法的代码:
def parse(self, response): tr_list = response.xpath("//table[@class='tablelist']/tr")[1:-1] for tr in tr_list: item = TencenthrItem() item["title"] = tr.xpath("./td[1]/a/text()").extract_first() item["position"] = tr.xpath("./td[2]/text()").extract_first() item["num"] = tr.xpath("./td[3]/text()").extract_first() item["location"] = tr.xpath("./td[4]/text()").extract_first() item["publish_date"] = tr.xpath("./td[5]/text()").extract_first() url = tr.xpath("./td[1]/a/@href").extract_first() item["detail_url"] = parse.urljoin(response.url, url) print(item) yield scrapy.Request( item["detail_url"], callback=self.parse_detail, meta={"item": item} ) next_url = response.xpath("//a[@id='next']/@href").extract_first() if next_url != "javascript:;": next_url = "http://hr.tencent.com/" +next_url print(next_url) yield scrapy.Request( next_url, callback=self.parse )
接下来获取详情页的岗位职责和要求,同样我们分析详情页面,如下:
详情页分析 我们可以很直接就能找到我们需要的信息,只需要编写对应的xpath,所以获取详情页的代码如下:
# 处理详情页 def parse_detail(self,response): item = response.meta["item"] job_intrs = response.xpath("//table[@class='tablelist textl']/tr[3]/td/ul/li/text()").extract() if job_intrs: item["job_intr"] = ",".join(job_intrs) else: item["job_intr"] ="无" job_resps = response.xpath("//table[@class='tablelist textl']/tr[4]/td/ul/li/text()").extract() if job_resps: item["job_resp"] = ",".join(job_resps) else: item["job_resp"] = "无" print(item) yield item
到这里,我们就已经基本完成了这个网站的爬取,同时为了完成对数据的存储,我们需要在pipline.py中编写相关的数据库存储代码:
client = MongoClient() collection = client["tencent"]["hr"] class TencenthrPipeline(object): def process_item(self, item, spider): if isinstance(item, TencenthrItem): print(item) collection.insert(dict(item)) return item
使用scrapy.Request()方法,其中常用参数有三个:
#切换到项目目录下 scrapy shell [url地址] #默认进入python交互环境,安装Ipython的情况下默认进入Ipython #可以在命令行环境下测试xpath的有效性 response.xpath('xxxxxx')
在项目下新建main.py文件,在文件中输入以下代码,即可
from scrapy.cmdline import execute import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) execute(['scrapy', 'crawl', 'hrspider'])
注意:这段代码的含义和我们在cmd窗口下输入的结果是相同的,我们这里不过使用的是scrapy.cmdline中的execute将我们要输入带cmd中的命令在这里拼接到一起而已。
本文分享自微信公众号 - 咸鱼学Python(xianyuxuepython)
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2018-07-27
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句