前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫 | Scrapy实战腾讯招聘

爬虫 | Scrapy实战腾讯招聘

作者头像
咸鱼学Python
发布2019-10-09 15:09:13
1.1K0
发布2019-10-09 15:09:13
举报
文章被收录于专栏:咸鱼学Python咸鱼学Python
前言

这个文章的技术含量并不高,旨在练习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

总结

什么时候需要构建多个piplines?
  1. 同一项目中有多个爬虫
  2. 数据需要进行不同的处理
在scrapy项目中如何构造请求?

使用scrapy.Request()方法,其中常用参数有三个:

  1. callback:表示当前请求的url响应交给哪个函数处理
  2. meta:实现不同解析函数之间传递数据
  3. dont_filter:scrapy默认会过滤url地址即请求过的地址不会再请求,对于url响应会变的请求,可以使用该参数反复抓取该地址。
为什么要定义item?
  1. 能明确爬取内容,需要爬取的字段清晰明了。
  2. 避免出现变量名写错的低级错误
如何使用scrapy shell?
#切换到项目目录下
scrapy shell [url地址]
#默认进入python交互环境,安装Ipython的情况下默认进入Ipython
#可以在命令行环境下测试xpath的有效性
response.xpath('xxxxxx')
如何在pycharm中调试运行scrapy项目?

在项目下新建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中的命令在这里拼接到一起而已。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咸鱼学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实战
    • 引入类库
      • 创建项目
        • 分析页面,编写代码
        • 总结
          • 什么时候需要构建多个piplines?
            • 在scrapy项目中如何构造请求?
              • 为什么要定义item?
                • 如何使用scrapy shell?
                  • 如何在pycharm中调试运行scrapy项目?
                  相关产品与服务
                  命令行工具
                  腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档