使用Scrapy框架编写 东方财富网eastmoney的爬虫

打开http://guba.eastmoney. om/点击   热门个股吧 里面的更多 

进入到这个界面,可以看到股票基本上有了,然后点击F12,打开网页源码 

首先可以查看菜单也就是泸市,深市那一块 

然后 为了方便,干脆就直接列出如下的起始地址

 

'http://guba.eastmoney.com/remenba.aspx?type=1&tab=1'
"http://guba.eastmoney.com/remenba.aspx?type=1&tab=2",
"http://guba.eastmoney.com/remenba.aspx?type=1&tab=3",
"http://guba.eastmoney.com/remenba.aspx?type=1&tab=4",
"http://guba.eastmoney.com/remenba.aspx?type=1&tab=5",
"http://guba.eastmoney.com/remenba.aspx?type=1&tab=6"

接着看每一个菜单对应下面的具体股吧的信息

可以 看出,网页市分成 两块进行展示的,也就是ngblistul2和 ngblistul2 hide 对应的ul下

 如下

以及点击 查看更多 之后的其他的股吧

我们点开其中一个之后查看下面的网页结构

 

也就是<a>标签里面的href就是我们想要的信息

记得将 ngblistul2和 ngblistul2 hide下的href拼接起来

list = response.xpath('/html/body/div[1]/div[5]/div[2]/div[1]/div/ul[1]/li')
list2 = response.xpath('/html/body/div[1]/div[5]/div[2]/div[1]/div/ul[2]/li')
list.extend(list2)

   获取到股吧的对应的网址之后,我们点开其中一个网页http://guba.eastmoney.com/list,600000.html

 有这样一些信息

也就是我们要爬去到的信息

打开网页源码

可以很容易看到我们要获取的信息,但这里那就是个坑

那就是能直接获取的只有股吧 名,像成交量涨幅 什么的并不能直接爬去到,后来 我重新加载了一下网页之后

找到了他异步获取数据的请求

由于不清楚这些参数有啥用,所以 只能 去看一下js源码

最后发现参数只需要更改 cmd 的 就可以了

那么 问题来了,cmd的 参数如何设置才合理了,因为股票编号和cmd的貌似不太一样

于是直接查找了一下网页源码中 6000001 所在的位置,发现存在于一个script就 存在了我们需要的信息

也就是里面的  quotecode就是 我们需要的cmd 参数,用如下进行提取

quoteCode = response.xpath('//*/script').re(r"var QuoteCode = \"(.*)\";")[0]

提取之后就是模拟发送请求了

quoteURL = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?type=CT&cmd=" + quoteCode + "&sty=FDFGBTB&st=z&sr=&p=&ps=&lvl=&cb=?&js=&token=5c46f660fab8722944521b8807de07c0";
        getres = self.send(quoteURL)
        tt=str(getres.decode('utf8')[4:-3]).split(",")
        print(tt)
def send(self,url):
        req = request.Request(url=url, headers=self.headers)
        res = request.urlopen(req)
        res = res.read()
        return res
        # 输出内容(python3默认获取到的是16进制'bytes'类型数据 Unicode编码,如果如需可读输出则需decode解码成对应编码):b'\xe7\x99\xbb\xe5\xbd\x95\xe6\x88\x90\xe5\x8a\x9f'
        print(res.decode(encoding='utf-8'))
        # 输出内容:登录成功

 好了,基本上就是这些了

接下来 直接给代码把

首先是一个start.py脚本,用来定时启动爬虫,在指定时间点运行

import datetime
import time

from scrapy import cmdline


def doSth(hour,min):
    # 把爬虫程序放在这个类里 zhilian_spider 是爬虫的name
    straa = 'scrapy crawl eastmoney -o ' + str(hour)+str(min)+".csv"
    cmdline.execute(straa.split())


# 想几点更新,定时到几点
def time_ti():
    while True:
        now = datetime.datetime.now()
        # print(now.hour, now.minute)
        if now.hour == 9 and now.minute == 30:
            doSth(9,30)
        if now.hour == 14 and now.minute == 30:
            doSth(14,30)
        if now.hour == 22 and now.minute == 0:
            doSth(22,00)
        # 每隔60秒检测一次
        time.sleep(60)
if __name__ == '__main__':
    time_ti()

然后是item.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 EastmoneyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # 股票名字
    name = scrapy.Field()
    # 股票编码
    id = scrapy.Field()
    # 关注量
    man_number = scrapy.Field()
    # 当前热度排行
    now_hot = scrapy.Field()
    # 最新
    latest = scrapy.Field()
    # 涨跌
    zhangdie = scrapy.Field()
    # 涨幅
    zhangfu = scrapy.Field()
    # 成交量
    chengjiaoliang = scrapy.Field()
    # 成交额
    chengjiaoe = scrapy.Field()
    # 流通市值
    shizhi = scrapy.Field()
    # 换手
    huanshou = scrapy.Field()
    # 振幅
    zhenfu = scrapy.Field()
    # 市盈
    shiying = scrapy.Field()
    pass

 

  eastmoneyspider\spiders\eastmoney.py,也就是爬取流程

# -*- coding: utf-8 -*-
import re
import time

import scrapy
from urllib import parse,request
from eastmoneyspider.items import EastmoneyspiderItem
class eastmoneySpider(scrapy.Spider):
    name = 'eastmoney'
    allowed_domains = ['guba.eastmoney.com']
    data = []
    # 浏览器用户代理
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
    }
    # 指定cookies
    cookies = {
        'qgqp_b_id': 'c6fbd3a403db8993b4dd3eb2a320ccb6',
        'st_si': '73594088022242',
        'em_hq_fls': 'js',
        'st_asi': 'delete',
        'HAList': 'a-sh-600000-%u6D66%u53D1%u94F6%u884C%2Ca-sh-601388-%u6021%u7403%u8D44%u6E90%2Ca-sh-603019-%u4E2D%u79D1%u66D9%u5149',
        '_adsame_fullscreen_17590': '1',
        'st_pvi': '70133729415159',
        'st_sp': '2019-06-23%2013%3A22%3A52',
        'st_inirUrl': 'https%3A%2F%2Fwww.sogou.com%2Flink',
        'st_psi': '20190623160613932-117001300421-1256798903',
        'st_sn': '46'
    }
    urls = [
        'http://guba.eastmoney.com/remenba.aspx?type=1&tab=1'
        "http://guba.eastmoney.com/remenba.aspx?type=1&tab=2",
        "http://guba.eastmoney.com/remenba.aspx?type=1&tab=3",
        "http://guba.eastmoney.com/remenba.aspx?type=1&tab=4",
        "http://guba.eastmoney.com/remenba.aspx?type=1&tab=5",
        "http://guba.eastmoney.com/remenba.aspx?type=1&tab=6"
    ]

    # 重写start_requests方法
    def start_requests(self):
        for url in self.urls:
            time.sleep(0.2)
            yield scrapy.Request(url=url, headers=self.headers, cookies=self.cookies, callback=self.parse)

    def parse(self, response):
        #这里是选择一中股票类型,列出他下面的所有的选项
        list = response.xpath('/html/body/div[1]/div[5]/div[2]/div[1]/div/ul[1]/li')
        list2 = response.xpath('/html/body/div[1]/div[5]/div[2]/div[1]/div/ul[2]/li')
        list.extend(list2)
        for i in list:
        #if True:
            #i = list[1]
            url = i.css('a::attr("href")').extract_first()
            detail = response.urljoin(url)
            yield scrapy.Request(url=detail, headers=self.headers, cookies=self.cookies, callback=self.parse2)
    def parse2(self,response):
        item = EastmoneyspiderItem()
        item['name'] = response.xpath('//*[@id="stockname"]/a/text()').extract_first()
        # 关注量
        item['man_number'] = response.xpath('//*[@id="stockheader"]/div[1]/span[1]/em/text()').extract_first()
        # 当前热度排行
        item['now_hot'] = response.xpath('//*[@id="stockheader"]/div[1]/span[2]/em/text()').extract_first()

        quoteCode = response.xpath('//*/script').re(r"var QuoteCode = \"(.*)\";")[0]
        quoteURL = "http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx?type=CT&cmd=" + quoteCode + "&sty=FDFGBTB&st=z&sr=&p=&ps=&lvl=&cb=?&js=&token=5c46f660fab8722944521b8807de07c0";
        getres = self.send(quoteURL)
        tt=str(getres.decode('utf8')[4:-3]).split(",")
        print(tt)

        item["id"]=tt[0]
        item['name'] = tt[3]
        # 最新
        item['latest'] = tt[4]
        # 涨跌
        item['zhangdie'] = tt[5]
        # 涨幅
        item['zhangfu'] = tt[6]
        # 成交量
        item['chengjiaoliang'] = tt[8]
        # 成交额
        item['chengjiaoe'] = tt[9]
        # 流通市值
        item['shizhi'] = tt[13]
        # 换手
        item['huanshou'] = tt[10]
        # 振幅
        item['zhenfu'] = tt[12]
        # 市盈
        item['shiying'] = tt[11]
        yield item

    def send(self,url):
        req = request.Request(url=url, headers=self.headers)
        res = request.urlopen(req)
        res = res.read()
        return res
        # 输出内容(python3默认获取到的是16进制'bytes'类型数据 Unicode编码,如果如需可读输出则需decode解码成对应编码):b'\xe7\x99\xbb\xe5\xbd\x95\xe6\x88\x90\xe5\x8a\x9f'
        print(res.decode(encoding='utf-8'))
        # 输出内容:登录成功

基本要写的代码如上,其他都是默认配置就好了,如果有需要可以再进行修改

对了,记得修改header和cookie

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值