Scrapyフレームワークを使用して、eastmoneyのクローラーを作成します

http://guba.eastmoney。om/を開き、人気のある株式バーで詳細クリックします 

このインターフェースに入ると、在庫が基本的に利用可能であることがわかります。次に、F12をクリックしてWebページのソースコードを開きます。 

まず、ルシと深センのメニューをチェックします。 

次に、便宜上、次のように開始アドレスをリストするだけです。

 

'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"

次に、以下の特定のストックバーに対応する各メニューの情報を見てください

ウェブページ市場は表示用に2つの部分に分かれていることがわかります。つまり、ngblistul2とngblistul2hideに対応するulの下にあります。

 次のように

後で他の株を見るにはクリックしてください

それらの1つをクリックして、次のWebページ構造を確認します。

 

つまり、<a>タグのhrefは必要な情報です

ngblistul2とngblistul2の非表示の下に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)

   ストックバーの対応するURLを取得した後、Webページhttp://guba.eastmoney.com/list,600000.htmlの1つをクリックします。

 このような情報を持っている

クロールしたい情報はどれですか

Webページのソースコードを開く

入手したい情報は見やすいですが、ここに落とし穴があります

つまり、直接取得できるのはストックバー名のみであり、取引量の増加などを直接クロールすることはできません。その後、Webページをリロードした後、

非同期でデータを取得するという彼のリクエストを見つけました

これらのパラメータが何であるかわからないので、jsのソースコードしか見ることができません。

最後に、パラメータはcmdを変更するだけでよいことがわかりました。

したがって、問題は、銘柄コードとcmdが異なるように見えるため、cmdパラメータを設定する方法が合理的であるということです。

そこで、ウェブページのソースコードで6000001の場所を直接検索したところ、必要な情報がスクリプトに存在することがわかりました。

つまり、内部の引用コードは必要な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'))
        # 输出内容:登录成功

 さて、それは基本的にそれです

コードのすぐ隣

1つ目は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'))
        # 输出内容:登录成功

作成する基本的なコードは上記のとおりです。その他はデフォルトの構成であり、必要に応じて変更できます。

ちなみに、ヘッダーとクッキーを変更することを忘れないでください

おすすめ

転載: blog.csdn.net/qq_20176001/article/details/94148439