Scrapy应用(一)

先创建一个工程

scrapy startproject game
cd game
scrapy genspider demo 4399.com

编写items

import scrapy


class GameItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name = scrapy.Field()
    url = scrapy.Field()

编写spider

import scrapy
from game.items import GameItem

class DemoSpider(scrapy.Spider):
    name = "demo"
    allowed_domains = ["4399.com"]
    start_urls = ['http://4399.com/']

    def parse(self, response):
        '''
        name = 名字
        img = 图标
        url = 网址
        '''
        items = []
        game_message = response.xpath('//ul[@class="tm_list"]/li')
        for one in game_message:
          item = GameItem()
          item['name'] = one.xpath('a/img/@alt').extract()[0]
          item['url'] = 'www.4399.com'+one.xpath('a/@href').extract()[0]
          items.append(item)
        return items

编写PIPELINE:

我们知道,pipelines.py是用来处理收尾爬虫抓到的数据的,
一般情况下,我们会将数据存到本地:

  • 文本形式: 最基本的方式
  • json格式 :方便其他程序员调用
  • 数据库: 数据量多时
#文本
import os
import requests
import json
import codecs
import pymysql
class GamePipeline(object):
    def process_item(self, item, spider):
        处理每一个从SZtianqi传过来的item
        fiename = 'F:/爬虫/data/game.txt'
        # 从内存以追加的方式打开文件,并写入对应的数据
        with open(fiename, 'a') as f:
            f.write(item['name']+'\n')
            f.write(item['url']+'\n')
        return item
#json
class gjson(object):
    def process_item(self, item, spider):

        filename = 'F:/爬虫/data/game.json'

        # 打开json文件,向里面以dumps的方式吸入数据
        # 注意需要有一个参数ensure_ascii=False ,不然数据会直接为utf编码的方式存入比如:“/xe15”
        with codecs.open(filename, 'a') as f:
            line = json.dumps(dict(item), ensure_ascii=False) + '\n'
            f.write(line)

        return item
#数据库
class gmysql(object):
    def process_item(self, item, spider):
        '''
        将爬取的信息保存到mysql
        '''

        # 将item里的数据拿出来
        name = item['name']
        url = item['url']

        # 和本地的scrapyDB数据库建立连接
        connection = pymysql.connect(
            host='localhost',  # 连接的是本地数据库
            user='root',        # 自己的mysql用户名
            passwd='000323624',  # 自己的密码
            db='scrapyDB',      # 数据库的名字
            charset='utf8mb4',     # 默认的编码方式:
            cursorclass=pymysql.cursors.DictCursor)

        try:
            with connection.cursor() as cursor:
                # 创建更新值的sql语句
                sql = """INSERT INTO game(name,url)
                        VALUES (%s, %s)"""
                # 执行sql语句
                # excute 的第二个参数可以将sql缺省语句补全,一般以元组的格式
                cursor.execute(
                    sql, (name,url))

            # 提交本次插入的记录
            connection.commit()
        finally:
            # 关闭连接
            connection.close()

        return item['name

编写Settings.py

#数字是优先级
ITEM_PIPELINES = {
   'game.pipelines.gmysql': 300,
   'game.pipelines.GamePipeline': 500,
   'game.pipelines.gjson': 400
}

注意事项

注意
item[‘name’] = one.xpath(‘a/img/@alt’).extract()[0]
extract转化为列表 [0]获得第一个元素str


   转载规则


《Scrapy应用(一)》 刘坤胤 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录