Python scrapy使用入门,爬取拉勾网上万条职位信息(上)

使用python实现爬虫的方式很多,典型的有urllib配合BeatifulSoup,代码也很简单,不过威力有限只适合入门尝鲜,想要真正收集大量有用数据拿来做数据分析就略感力不从心,这时不得不提scrapy了,一个专业的爬虫框架。看了网上很多的入门教程,很多都难以跑通,毕竟链接变化很快,如果不系统了解其原理,很难更正回来。所以本篇还是从一个成功的案例记录下,方便爱学习的你我他。
(一)首先要确定安装好了相应环境
安装scrapy,建议命令安装,pip install scrapy
确定环境安装好了,随意新建一个文件夹,按shift和鼠标右键,在当前位置打开命令行,输入scrapy,如果有帮助提示,则说明环境安装成功,如图:
这里写图片描述

(二)环境安装好了之后,新建工程:
我在D盘下spider目录里新建了个文件夹作为我们的新工程,取名Lagou,当然名字随便起,然后进去,在当前位置打开命令行后,输入:

    scrapy startproject First 

这时会生成一堆文件,先不管都是干什么的,已创建了名为First的爬虫工程。
根据命令提示,cd进到First文件夹,继续输入:

    scrapy genspider second lagou

这句命令会帮助我们生成需要的写代码的文件,也是爬虫文件,我们主要在这个里面写代码,这句命令生成了一个爬虫,名为second。后面的lagou是需要爬取的域名信息,可以暂时随意填,待会进入代码还要修改,不用纠结。

(三)打开IDE,我用的是pyCharm,不用多说,界面高端大气上档次,直接点击左上角文件->open->选择工程目录lagou下的First文件夹,点确定,即可将工程导入到IDE。
(四)先修改Item.py文件,我们需要在这个文件里定义我们需要爬取的字段:

import scrapy

class FirstItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
jobClass = scrapy.Field()
jobUrl = scrapy.Field()

这里我们定义了两个字段,工作类型jobClass,和该类型的超链接jobUrl
然后进入spider目录下的second.py,开始写我们的代码之前,我们需要先分析网页实际情况,看下我们感兴趣的字段在什么位置,打开Google浏览器,输入拉钩的网址:
http://www.lagou.com
按F12打开开发者模式,点击左上角的鼠标箭头,可以跟踪页面中的元素。
这里写图片描述

然后找到字段所在位置,方法吧,就是一个个展开那些个标签,
这里写图片描述

可以看到到了dd标签,我们需要的东西都出现了。
代码如何写呢,这时我们要通过response的xpath方法中的表达式来获取到这个位置,

for item in response.xpath(‘//div[@class=”menu_box”]/div/dl/dd/a’):

完整代码如下:

# -*- coding: utf-8 -*-
import scrapy
from First.items import FirstItem

class SecondSpider(scrapy.Spider):
    name = 'second'
    allowed_domains = ['http://www.lagou.com']
    start_urls = ['https://www.lagou.com/']

    def parse(self, response):
        for item in response.xpath('//div[@class="menu_box"]/div/dl/dd/a'):
        jobClass = item.xpath('text()').extract()#提取文本内容
        jobUrl = item.xpath("@href").extract_first()#提取链接内容

        oneItem = FirstItem()#实例化一个item对象,将获取到的数据存入
        oneItem["jobClass"] =jobClass
        oneItem["jobUrl"] = jobUrl
        yield oneItem#输出item

至此为止,我们的爬虫已具雏形了。可以马上运行感受一下。scrapy的爬虫应用运行方式不同于python。需要在命令行里执行如下代码:

scrapy crawl second

需要注意的是,这里的second是我们定义的爬虫的名字,在代码中如图位置:
这里写图片描述
刚开始我按照别人的例子敲,总是遇到找不到工程的错误,后来发现这个地方很容易忽略。切记切记。

当然还有一种方式,可以使其在IDE中运行,控制台输出结果。
在工程顶级目录下新建一个python文件名字随意,比如runmyProgram.py
输入如下命令:
        from scrapy.cmdline import execute
        execute(['scrapy','crawl','second'])
        然后右键,运行此文件即可。

这里写图片描述
可以看到,已经显示出了爬取的结果:
这里写图片描述

第一部分告一段落,现在开始第二部分。

回到刚刚的命令行窗口,再输入命令将其导出到文件(IDE里修改runmyProgram.py中的命令亦可):

scrapy crawl second -o shujv.json

这时会在当前目录下生成一个文件,打开看到我们的数据都导出来了,可是,很明显编码未处理,以至于都是英文字符。
这里写图片描述
通过阅读源码知道,在scrapy.exporters 的 JsonLinesItemExporter类中,对数据进行了编码。所以我们可以在spiders文件夹的同级目录下创建一个文件夹,名字随意,比如我新建了recode,在该文件夹中创建一个init.py文件,在里面写一个类继承JsonLinesItemExporter,并且设置不要任何编码,如果你是pyCharm,会在新建python package时自动生成init.py文件,在文件中添加如下代码:

from scrapy.exporters import JsonLinesItemExporter


class recodes(JsonLinesItemExporter):

    def __init__(self, file, **kwargs):
        super(recodes,self).__init__(file, ensure_ascii = None)

然后打开settings.py文件,在其中添加配置:

    FEED_EXPORTERS_BASE = {
    'json': 'First.recode.recodes',#这个位置注意是文件索引,根据你实际情况修改。
    'jsonlines' : 'scrapy.contrib.exporter.JsonLinesItemExporter'

再次运行刚才的命令导出文件:
这里写图片描述

好啦,任务完成,下课休息十分钟。十分钟后继续开始下篇

参考文章:http://blog.csdn.net/dangsh_/article/details/78587729

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值