使用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項目

創建的命令是 scrapy startproject 項目名稱

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

首先建立項目

scrapy startproject 項目名稱

scrapy startproject mySpider

然後進入該目錄下

其中, mySpider 爲項目名稱,可以看到將會創建一個 mySpider 文件夾。我們使用
pycharm 打開這個項目,目錄結構大致如下:

下面來簡單介紹一下各個主要文件的作用:
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 配置,就像下面所示:

將爬蟲協議改爲true

然後就可以運行了:

命令是:在後臺輸入scrapy crawl boss

 或者可以在根目錄下創建一個main.py文件

裏面的程序如圖所示:

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

在settings.py文件可以寫入運行的日誌文件

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章