使用scrapy框架爬取数据

一、环境准备

首先我采用anacoda环境,需要首先建造一个项目,并激活

建立一个爬虫项目:

conda create -n Spider python == 3.6.2

conda create -n Spider python == 3.6.2

然后激活环境

activate Spider

再此环境下需要下载scrapy模块和pywin32模块

pip install scrapy

pip install pywin32

具体Scrapy 安装流程参考:http://doc.scrapy.org/en/latest/intro/install.html#intro-install-platform-notes 里面有各个平台的安装方法

二、报错处理:

1、使 用 Scrapy 时 遇 到 0: UserWarning: You do not have a working installation of theservice_identity module: 'cannot import name 'opentype''. Please install it from ..的问 题解决http://www.bubuko.com/infodetail-2467560.html

2、报 etree的错误

原因:默认安装的 lxml 版本太高(默认安装最新版),卸载后,重新安装 3.8 以下版本
conda uninstall lxml
conda install lxml==3.8

3、解决 Scrapy 安装错误:Microsoft Visual C++ 14.0 is required... 问题描述:
当前环境 win7,python_3.6.1,64 位。
在 windows 下,在 dos 中运行 pip install Scrapy 报错:
error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

解决方法;

http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载 twisted 对应版本的 whl 文件(如我的 Twisted-18.4.0-cp36-cp36m-win_amd64.whl),cp 后面是 python 版本,amd64 代表 64 位,运行命令:
pip install C:\Users\ibm\Downloads\Twisted-18.4.0-cp36-cp36m-win_amd64.whl

4、解决 scrapy 运行报 No module named 'win32api

解决方法:
pip install pywin32

如果网速不行,可登录:https://pypi.org/project/pywin32/#files,进行下载

使用scrapy框架爬取数据_第1张图片

 

三、创建并运行项目

然后开始在此环境下建立scrapy项目

创建的命令是 scrapy startproject 项目名称

例如要爬取boss直聘中所有的python职位

首先建立项目

scrapy startproject 项目名称

scrapy startproject mySpider

然后进入该目录下

使用scrapy框架爬取数据_第2张图片

其中, mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹。我们使用
pycharm 打开这个项目,目录结构大致如下:

使用scrapy框架爬取数据_第3张图片

下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的 Python 模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件

建立好需要爬取的字段

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class Day0510Item(scrapy.Item): # 声明字段
    # define the fields for your item here like:
    # 定义需要的字段
    name = scrapy.Field()
    Responsibility = scrapy.Field()

class Boss0510Item(scrapy.Item): # 声明字段
    # define the fields for your item here like:
    # 定义需要的字段
    title = scrapy.Field()
    salary = scrapy.Field()
    request = scrapy.Field()
    name = scrapy.Field()
    biaoqian = scrapy.Field()


mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录

以爬boss直聘所有python职位的前十页为例

首先创建爬取程序

scrapy gender boss zhipin.com

创建的程序在spider目录下

现在items文件定义存储字段,明确存储信息

代码如下

 

然后开始编写爬取程序

代码如下

# -*- coding: utf-8 -*-
import scrapy
from lxml import etree
from day0510.items import Boss0510Item
class BossSpider(scrapy.Spider):
    name = 'boss'
    allowed_domains = ['zhipin.com']
    start_urls = []
    for page in range(1,11):
        url = 'https://www.zhipin.com/c101010100/?query=python&page={}&ka=page-next'.format(page)
        start_urls.append(url)



    def parse(self, response):
        try:
            content = response.body.decode('utf-8')
            # with open('boss.html','w',encoding='utf-8') as fp:
            #     fp.write(content)
            tree = etree.HTML(content)
            li_list = tree.xpath('//div[@class="job-list"]/ul/li')

            for li in li_list:
                item = Boss0510Item()
                title = li.xpath('.//div[@class="job-title"]/text()')[0]
                salary = li.xpath('.//span[@class="red"]/text()')[0]
                request = li.xpath('.//div[@class="info-primary"]/p/text()')
                name = li.xpath('.//div[@class="info-company"]//h3/a/text()')
                biaoqian = li.xpath('.//div[@class="info-company"]//p//text()')
                print(biaoqian)
                item['title'] = title
                item['salary'] = salary
                item['request'] = request
                item['name'] = name
                item['biaoqian'] = biaoqian
                # with open('boss1.txt','a',encoding='utf-8') as fp:
                #     fp.write(title+salary+request+name+biaoqian+'\n')
                yield item
        except:
            pass


当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,这些 Item Pipeline 组件
按定义的顺序处理 Item

pipelines文件代码如下:

# -*- coding: utf-8 -*-
import json
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

# 管道
class Day0510Pipeline(object):
    def process_item(self, item, spider):

        # 在这个地方存储数据,可以写入文件中,也可以写进文件库
        fp = open('tencent.json','a',encoding='utf-8')
        json.dump(dict(item),fp,ensure_ascii=False)
        return item

class BossPipeline(object):
    def process_item(self, item, spider):

        # 在这个地方存储数据,可以写入文件中,也可以写进文件库
        # fp = open('boss.txt','a',encoding='utf-8')
        # json.dump(dict(item),fp,ensure_ascii=False)
        with open('boss.txt','a',encoding='utf-8') as fp:
            fp.write(json.dumps(dict(item),ensure_ascii=False)+'\n')
        return item

setting设置文件中需要注意的是;

需要启用一个 Item Pipeline 组件,为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置,就像下面所示:

使用scrapy框架爬取数据_第4张图片

将反爬虫协议改为False,默认是true,不该无法进行

使用scrapy框架爬取数据_第5张图片

然后就可以运行了:

命令是:在后台输入scrapy crawl boss

 或者可以在根目录下创建一个main.py文件

里面的程序如图所示:

from scrapy import cmdline
# cmdline.execute("scrawl crawl taoche --nolog".split())
cmdline.execute("scrapy crawl boss".split())

在settings.py文件可以写入运行的日志文件

使用scrapy框架爬取数据_第6张图片

 

 

你可能感兴趣的:(python爬虫)