day069 Scrapy_base_use

scrapy框架

  • scrapy是一個爬蟲框架。由引擎,爬蟲程序,調度表,下載器以及管道組成。
  • 引擎負責其他四個模塊的調度
  • 爬蟲程序是爬蟲的起點,負責生成url以及對下載器下載的response的處理
  • 調度表是對傳過來的url進行封裝,形成request隊列
  • 下載器負責請求網頁,返回數據,以供爬蟲程序進行解析
  • 管道負責對返回後的item進行存儲

架構圖

# scrapy架構圖

框架執行步驟

  1. 爬蟲程序提交url給引擎
  2. 引擎將url交給調度器,調度器生成request對象,傳給引擎
  3. 引擎將request對象傳給下載器進行下載,返回response對象
  4. 引擎將response對象傳給爬蟲程序,爬蟲程序初步解析response將需要繼續下載的url和一杯存儲的item分別傳給引擎
  5. 引擎將url傳給調度器重複2-4步,將item傳給管道
  6. 管道將item文件進行存儲

爬蟲的基本步驟

  1. 明確目標:明確要爬取的網站,網站內的信息點
  2. 請求網頁獲取,數據
  3. 對數據進行解析,清洗
  4. 對解析後的數據進行存儲

scrapy的基本操作


scrapy的基本操作

        1.創建爬蟲的項目
             scrapy startproject xxx
        2.創建爬蟲的文件
            cd xxx
            scrapy genspider 名字  範圍
        3.運行爬蟲

             scrapy crawl 爬蟲的名字

             scrapy runspider xxx.py(注意點 必須是在爬蟲文件路徑下)

        4.解析數據
            4.1 items 文件 設置解析的key
            4.2 在爬蟲的文件中 解析數據 框架自動轉換類型
                .xpath().extract()[0]
            4.3 yiled 給 引擎 -->管道
        5.數據存儲
            5.1 不管管道 自己存 scrapy crawl xxx -o 文件名字
            5.2 使用管道
                pipelinse 
                    1.開啓爬蟲
                    2.process_item()
                    3.關閉爬蟲

                    4.千萬注意: 最後在setting 開啓管道

scrapy shell  測試 解析的數據是否正確
        1. 如果 是在項目路徑下  默認會加載 項目的settings

        2. 桌面 路徑, 需要自己設置
           scrapy  shell "url" -s key=value

        3.  測試
            /text()
            /@屬性
            extract() --list
            extract_first() 返回字符串  None

            // css 選擇器
            response.css(".acloud ::text")
            response.css(".acloud ::attr('bz')")

示例:爬取騰訊社招網站上海的所有招聘信息

# 示例 文件結構.png

 setting.py
BOT_NAME = 'Tencent'

SPIDER_MODULES = ['Tencent.spiders']
NEWSPIDER_MODULE = 'Tencent.spiders'

USER_AGENT="Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4"

ROBOTSTXT_OBEY = False

ITEM_PIPELINES = {
   'Tencent.pipelines.TencentListPipeline': 300,
}

tencent3.py
# -*- coding: utf-8 -*-

import scrapy
from Tencent.items import TencentListItem


class Tentent_Spider(scrapy.Spider):
    # 1.爬蟲名字
    name = 'tencent3'
    # 2. 爬蟲的範圍
    allowed_domains = ['tencent.com']
    base_url = 'https://hr.tencent.com/position.php?keywords=&tid=0&lid=2175&start='

    url_list = []
    for page in range(0, 6):
        url = base_url + str(page * 10)
        url_list.append(url)

    # 3. 開始的Url
    start_urls = url_list

    def parse(self, response):
        # 解析數據
        tr_list = response.xpath('//tr[@class="even"]|//tr[@class="odd"]')

        # 遍歷
        for tr in tr_list:
            item = TencentListItem()
            item['work_name'] = tr.xpath('./td/a/text()').extract_first()
            item['work_type'] = tr.xpath('./td[2]text()').extract_first()
            item['work_count'] = tr.xpath('./td[3]text()').extract_first()
            item['work_place'] = tr.xpath('./td[4]text()').extract_first()
            item['work_time'] = tr.xpath('./td[5]text()').extract_first()
            item['work_link'] = tr.xpath('./td/a/@href').extract_first()

            # 發送詳情頁 的請求 --》引擎--》調度器
            yield scrapy.Request(url=item['work_link'], meta={'tencentItem': item}, callback=self.detail_parse)

    # 解析詳情頁的數據
    def detail_parse(self, response):
        ul_list = response.xpath('//ul[@class="squareli"]')

        item = response.meta['tencentItem']
        item['work_duty'] = "".join(ul_list[0].xpath('.li/text()').extract())
        item['work_requir'] = "".join(ul_list[1].xpath('./li/text()').extract())

        # 數據解析完畢 交給 引擎--》管道
        yield item

items.py
# -*- coding: utf-8 -*-

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

import scrapy


class TencentListItem(scrapy.Item):
    work_name = scrapy.Field()
    work_type = scrapy.Field()
    work_count = scrapy.Field()
    work_place = scrapy.Field()
    work_time = scrapy.Field()
    work_link = scrapy.Field()

    work_duty = scrapy.Field()
    work_require = scrapy.Field()

pipelines.py
# -*- coding: utf-8 -*-

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


class TencentListPipeline(object):
    # 打開文件
    def open_spider(self, spider):
        self.file = open('tententList.json', 'w')

    # 轉換格式,寫入文件
    def process_item(self, item, spider):
        # 判斷 item是列表頁還是詳情頁
        str_item = json.dumps(dict(item)) + '\n'
        self.file.write(str_item)

        return item  # 給其他管道使用

    # 關閉文件
    def close_spider(self, spider):
        self.file.close()

結果

# 爬取的數據結果.png

發佈了69 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章