数据收集-爬虫技术(python+scrapy+centos抓取股票公告并入库)(废弃:目标网站已改版,暂不可用)

背景

爬虫技术是索取互联网信息主要手段,一直想接触,但并没有实体项目。近期偶尔关注股票,一位朋友非常强调每个公司的公告信息的重要性,甚至在短期内极度影响一直股票的走势。
所以,自己基于scrapy+python实现了一个小爬虫,目标是爬取股票公告,并入库,以待以后的机器学习分析。

概要设计

功能描述

  • 爬虫服务爬取目标网站数据(包括翻页之后的数据)
  • 将数据进行入库操作

模块设计

在这里插入图片描述

详细设计

目标网站分析

地址:http://data.eastmoney.com/notices/stock/002415.html
在这里插入图片描述
这个地址的尾号是股票代码002415,那么我们在url里面不加代码,直接访问会是怎么样呢?
地址:http://data.eastmoney.com/notices/
在这里插入图片描述
点击一下下一页,看看network里面返回了什么内容
在这里插入图片描述
复制地址如下:
http://data.eastmoney.com/notices/getdata.ashx?StockCode=&FirstNodeType=0&CodeType=1&PageIndex=2&PageSize=50&jsObj=CuxhmQJG&SecNodeType=0&Time=&rt=52105407

  • PageIndex应该就是分页的页数
  • PageSize,是每页的数量

我们用浏览器访问一下看看结果:
在这里插入图片描述
是一段js的代码,不过后面的数据全部是json的,这些数据基本可以被我们所用。

把数据格式化一下看看,是什么样的。
在这里插入图片描述
最下面这个url,应该就是详情页,进去看看
在这里插入图片描述
那么,我们的目标就初步达成了:

  • 获取股票目录列表,并且还可以分页
  • 获取股票公告详情页

数据库表设计

字段分析

在这里插入图片描述
勾选出来的字段依次是:

  • 标题
  • 股票代码
  • 股票名称
  • 股票交易所类型
  • 股票公告详情地址

库表设计语句

create database if not exists dbstock;

CREATE TABLE `t_stock` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `code` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `publish_time` varchar(255) DEFAULT NULL,
  `text` longtext,
  `text_md5_hex` varchar(100) NOT NULL,
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `text_md5_hex_uniq` (`text_md5_hex`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3550 DEFAULT CHARSET=utf8mb4

项目实战

安装scrapy(默认已经安装了python)

pip install scrapy

创建项目

打开anaconda prompt,进入到一个空目录(我们希望创建项目的目录),输入:
scrapy startproject crawler命令来创建项目(crawler是项目名称,可任意)
在这里插入图片描述

创建爬虫

cd crawler
scrapy genspider announcement example.com 创建爬虫

pycharm打开项目

打开pycharm,file->open,输入F:\my_code\crawler,打开爬虫项目

在这里插入图片描述

在这里插入图片描述

运行hello_world

修改start_urls
在这里插入图片描述
为了启动方便,添加一个启动入口(也就是main函数之类的)

# -*- coding: utf-8 -*-
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

process = CrawlerProcess(get_project_settings())
process.crawl('announcement')
process.start()

放到保存后放到根目录即可
在这里插入图片描述

运行看一下结果:
在这里插入图片描述

解析字段

在这里插入图片描述

获取翻页字段

在这里插入图片描述
注:
text = response.xpath('//div[@class="detail-body"]/div/text()').extract_first()
使用了xpath的语法,这里需要对xpath有基础的了解

添加items,为入库做准备(也就是java中的model)

在这里插入图片描述
注意,StockItem中的每个字段必须和数据库的字段名保持一致

添加pipelines,进行入库操作(也就是java中的dao)

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

import utils.db_connection_pool as pool
from crawler.items import StockItem
import config.setting as setting

# 指定表格
table_dic = {
    StockItem: 'dbstock.t_stock',
}

# 指定数据库参数
PYMYSQL_ONE = dict(
    host=setting.DB_HOST,
    port=setting.DB_PORT,
    user=setting.DB_USER,
    password=setting.DB_PASSWORD,
)


class CrawlerPipeline(object):
    def __init__(self):
    	# init中获取数据库连接
        self.conn = pool.get_connection(**PYMYSQL_ONE)

	# 拼接sql参数
    def get_params(self, columns):
        params_format = ['%s'] * len(columns)
        return ','.join(params_format)

	# 回调执行数据库操
    def process_item(self, item, spider):
        sql = "REPLACE INTO {} ({}) VALUES ({})".format(
            table_dic[type(item)],
            ','.join(item.keys()),
            self.get_params(item.keys())
        )
        cur = self.conn.cursor()
        cur.execute(sql, list(getattr(item, '_values').values()))
        cur.close()
        return item

修改配置,启动这个pipeline
在这里插入图片描述

完成入库

在这里插入图片描述

总结

此项目做了一个最小化的爬虫实现,仅供入门参考

后续补充

utils/db_connection_pool.py

# -*- coding: UTF-8 -*-
"""
@描述:数据库连接池管理模块
"""

import pymysql
from DBUtils.PooledDB import PooledDB
import config.setting as setting

pool_dict = dict()


def get_connection(host, port, user, password):
    if host in pool_dict:
        return pool_dict.get(host).get_conn()
    else:
        pool = ConnectionPool(host, port, user, password)
        pool_dict.setdefault(host, pool)
        return pool.get_conn()


class ConnectionPool(object):
    __pool = None

    def __init__(self, host, port, user, password):
        if self.__pool is None:
            self.__pool = PooledDB(creator=pymysql, mincached=setting.DB_MIN_CACHED, maxcached=setting.DB_MAX_CACHED,
                                   maxshared=setting.DB_MAX_SHARED, maxconnections=setting.DB_MAX_CONNECYIONS,
                                   blocking=setting.DB_BLOCKING, maxusage=setting.DB_MAX_USAGE,
                                   setsession=setting.DB_SET_SESSION,
                                   host=host, port=port,
                                   user=user, passwd=password, use_unicode=False,
                                   charset=setting.DB_CHARSET)

    def get_conn(self):
        return self.__pool.connection()

config/setting_dev.py

# coding:utf-8


'''
@描述:数据库配置信息
'''

# 大数据数据库
DB_HOST = "172.16.200.17"
DB_PORT = 3306
DB_USER = "xxx"
DB_PASSWORD = "xxxx"

# 数据库连接编码
DB_CHARSET = "utf8"
# mincached : 启动时开启的闲置连接数量(缺省值 0 以为着开始时不创建连接)
DB_MIN_CACHED = 10
# maxcached : 连接池中允许的闲置的最多连接数量(缺省值 0 代表不闲置连接池大小)
DB_MAX_CACHED = 10
# maxshared : 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
DB_MAX_SHARED = 20
# maxconnecyions : 创建连接池的最大数量(缺省值 0 代表不限制)
DB_MAX_CONNECYIONS = 20
# blocking : 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......>; 其他代表阻塞直到连接数减少,连接被分配)
DB_BLOCKING = True
# maxusage : 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
DB_MAX_USAGE = 0
# setsession : 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...]
DB_SET_SESSION = ['SET AUTOCOMMIT = 1']
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,您的问题是关于如何基于PythonScrapy、Redis和Rule组件实现分布式爬虫爬取京东华为笔记本的。首先,您需要安装Scrapy和Redis,并在Scrapy的配置文件中添加Redis相关的配置: ```python # 在settings.py中添加以下配置 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" SCHEDULER = "scrapy_redis.scheduler.Scheduler" SCHEDULER_PERSIST = True REDIS_URL = 'redis://localhost:6379' ``` 然后,您需要编写Spider和Item Pipeline,其中Spider负责解析并抓取网页,Item Pipeline负责处理抓取到的数据。下面是一个示例的Spider代码: ```python from scrapy_redis.spiders import RedisSpider from scrapy.selector import Selector from ..items import ProductItem class JdSpider(RedisSpider): name = 'jd' redis_key = 'jd:start_urls' def parse(self, response): sel = Selector(response) products = sel.xpath('//div[@class="gl-i-wrap"]') for product in products: item = ProductItem() item['name'] = product.xpath('div[@class="p-name"]/a/em/text()').extract_first() item['price'] = product.xpath('div[@class="p-price"]/strong/i/text()').extract_first() item['url'] = product.xpath('div[@class="p-name"]/a/@href').extract_first() yield item ``` 在Item Pipeline中,您可以对抓取到的数据进行清洗和存储,下面是一个示例的Item Pipeline代码: ```python import pymongo class JdPipeline(object): def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db['products'].insert(dict(item)) return item ``` 最后,您需要创建一个Redis队列,并向队列中添加起始URL,如下所示: ```python import redis r = redis.Redis(host='localhost', port=6379) r.lpush('jd:start_urls', 'https://search.jd.com/Search?keyword=%E5%8D%8E%E4%B8%BA%E7%AC%94%E8%AE%B0%E6%9C%AC&enc=utf-8') ``` 最终,您就可以运行分布式爬虫抓取京东华为笔记本的数据了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值