美文网首页Python新世界
Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

作者: 919b0c54458f | 来源:发表于2018-08-07 16:23 被阅读11次

    前言

    这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。

    先上一波爬取结果:

    进群:125240963   即可获取数十套PDF哦!

    日志部分截图

    数据库部分截图

    实战

    引入类库

    import scrapy

    from urllib import parse

    from pymongo import MongoClient

    创建项目

    #有虚拟环境的可以先切换到对应的虚拟环境下

    #创建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?

    同一项目中有多个爬虫

    数据需要进行不同的处理

    在scrapy项目中如何构造请求?

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

    callback:表示当前请求的url响应交给哪个函数处理

    meta:实现不同解析函数之间传递数据

    dont_filter:scrapy默认会过滤url地址即请求过的地址不会再请求,对于url响应会变的请求,可以使用该参数反复抓取该地址。

    为什么要定义item?

    能明确爬取内容,需要爬取的字段清晰明了。

    避免出现变量名写错的低级错误

    如何使用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中的命令在这里拼接到一起而已。

    相关文章

      网友评论

        本文标题:Scrapy玩爬虫的肯定都知道!那么他多牛逼?你知道吗?

        本文链接:https://www.haomeiwen.com/subject/mlsavftx.html