1. 程式人生 > >Python爬蟲入門(爬取某網頁財經部分股票資料)

Python爬蟲入門(爬取某網頁財經部分股票資料)

1:反思部分

之前上學期也是看過一點點爬蟲的東西,然後時間太久了也基本哪裡學的又還給哪裡了。然後這兩週的時間被班主任的要求下開始一點一點接觸爬蟲,開始的時候覺的很害怕。可能是因為我這個人的性格,對於未接觸過的事物總有一些莫名的恐懼感,而且之前做東西總習慣了旁邊有個大佬帶著,有什麼問題找大佬就行了,所以獨立做東西的能力確實十分欠缺,做完了一項工作之後對於整個專案的理解並不是很深刻。之前大資料分組的時候xx同學也說一個人當領導做事情和在別人手下做事情的感覺是不一樣的。雖然突然獨立一個人去完成某項任務很艱鉅,這個過程也難免會浪費很多時間,但是當獨立一個人完成一個任務的時候那種成就感是十分舒服的。就像這次的爬蟲一樣,大概一共花了一整天的時間就給做完了。雖然走了很多彎路,但是一天的時間就給做完了也是讓我自己覺得很厲害了。
總結:做事情要下定決心,給自己一個deadline。儘量所有的任務都自己完成才能有能力的提升。

2:程式部分

整個程式是由兩個部分組成的,第一次很自以為是的做了一個手動輸入股票程式碼號爬取單支股票所有的資料的程式,以為已經很好了。然後交給班主任的時候才知道既然要做爬蟲資料就是要越多越好。所以第二天,也就是今天中午給自己定目標中午不修改完不給睡午覺。。然後就很快的就改好了。內心本來是不是很想在一個已經做好的程式上進行改動的。。。。

(1)getcode.py是獲取網易財經上某一部分所有的股票程式碼

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 31 19:51:25 2017

@author: Administrator
"""

import
urllib.request from bs4 import BeautifulSoup import urllib.parse class Spider(object): def __init__(self): self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36' self.headers = {'User-Agent': self.user_agent} def
getcode(self,url):
try: request=urllib.request.Request(url,headers=self.headers) response=urllib.request.urlopen(request) data=response.read() soup = BeautifulSoup(data, 'html.parser', from_encoding='utf-8') links = soup.find_all('table',class_='fn_cm_table') codes0=[] str2=[] for link in links: codes0.append(link.get_text()) str0=codes0[0].split('\n\n\n') for str1 in str0: str2.append(str1.split('\n')) # 從網頁中分離出所需資料 with open("H:\學習資料\機器學習\爬蟲\股票爬蟲\codes.txt",'a') as fp: fp.write(str2[2][2]+"\t"+str2[2][3]+"\n") print(str2[2][2]+"\t"+str2[2][3]) # 由於第一個元素前多一個空格,所以與其他元素分開 for i in range(3,len(str2)): with open("H:\學習資料\機器學習\爬蟲\股票爬蟲\codes.txt",'a') as fp: fp.write(str2[i][1]+"\t"+str2[i][2]+"\n") print(str2[i][1]+"\t"+str2[i][2]) # print(str2) except Exception as e: print(e) if __name__=='__main__': url0="http://quotes.money.163.com/data/caibao/yjgl_ALL.html?reportdate=20170930&sort=publishdate&order=desc&page=" for i in range(0,138): url=url0+str(i) spider=Spider() spider.getcode(url)

小結:
1)這個部分主要是通過beautifulsoup包爬取網頁上的標籤內的資料,然後將爬取下來的資料進行稍微的處理一下儲存在本地上。
2)還有一部分就是通過迴圈來重複爬取不同網頁內的資料,用str(i)來將i(int)轉換為str型別,然後放在url中進行爬取
3)會用python中的“if name==’main‘”語句了。。。。
4)由於電腦中同時安裝了python2和python3,設定的預設pip是在python2上的。所以在windows需要pip的時候,直接pip是python2,切換python3需要輸入“python3 -m pip install *”
5)獲取控制檯輸入的時候raw_input()和input()的區別
6)資料多的話寫在文字中最好用“\t”不要用空格保持格式大體美觀
7)檔案讀取遍歷每一行用for迴圈(for line in open(“url”)),單純開啟檔案用(with open(“url”) as fp)

(2)main.py這個方法主要是對getcodes.py中爬取的3千多個程式碼進行逐條爬取每天的資料
程式碼如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Oct 31 18:08:33 2017

@author: Administrator
"""

import urllib.request
import pymysql
from bs4 import  BeautifulSoup
import urllib.parse

class Spider(object):
    def __init__(self):
        self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36'
        self.headers = {'User-Agent': self.user_agent}    

    def save(self,list,line1):
#        資料儲存到資料庫中
        db = pymysql.connect("localhost","root","123","gupiao",charset="utf8")
        # 使用 cursor() 方法建立一個遊標物件 cursor
        cursor = db.cursor()
        insert_color = ("INSERT INTO gupiao(code,name,date,shoupan,zhangdiefu,huanshoulv,zijinliuru,zijinliuchu,jingliuru,zhuliliuru,zhuliliuchu,zhulijingliuru)" "VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)")
        data_color = (line1[0],line1[1],list[0],list[1],list[2],list[3],list[4],list[5],list[6],list[7],list[8],list[9])
        try:
            cursor.execute(insert_color, data_color)
            db.commit()
        except:
            print('報錯!')
        db.close()

    def soup(self,url,line1):
        try:
            request=urllib.request.Request(url,headers=self.headers)
            response=urllib.request.urlopen(request)
            data=response.read()
            soup = BeautifulSoup(data, 'html.parser', from_encoding='utf-8')
            links = soup.find_all('div',class_='inner_box')
            datas=[]
            for link in links:
                datas.append(link.get_text())
            str1=datas[0].split('\n')
#            資料爬取
            local="H:\學習資料\機器學習\爬蟲\股票爬蟲\\"+str(line1[0])+".txt"
            list1=[]
            with open(local,'a') as fp:
                fp.write("\t日期\t收盤價\t漲跌幅\t換手率\t資金流入(萬元)\t資金流出(萬元)\t淨流入(萬元)\t 主力流入(萬元)\t主力流出(萬元)\t主力淨流入"+'\n')
            for i in range(0,50):     
                sum1=[] 
                sum1.append(str1[i*13+17])
                sum1.append(str1[i*13+18])
                sum1.append(str1[i*13+20])
                sum1.append(str1[i*13+21])
                sum1.append(str1[i*13+22])
                sum1.append(str1[i*13+23])
                sum1.append(str1[i*13+24])
                sum1.append(str1[i*13+25])
                sum1.append(str1[i*13+26])
                sum1.append(str1[i*13+27])
                with open(local,'a') as fp:
                    fp.write('\t'+str(sum1)+'\t'+'\n')  
                print(sum1)
                self.save(sum1,line1)
        except Exception as e:
            print("爬取完畢")
        return list1

    def read(self):
        try:

            for line in open("H:\學習資料\機器學習\爬蟲\股票爬蟲\codes.txt"):
                print(line)    
                line1=line.split("\t")
                for i in range(0,1):
        #        i:爬取頁數
                    url="http://quotes.money.163.com/trade/lszjlx_"+line1[0]+","+str(i)+".html"
                    self.soup(url,line1)
        except Exception as e:
            print("爬取完畢")     
        return line1

if __name__=='__main__':   

        spider=Spider()
        str1=spider.read()

小結:
1)這個地方主要是資料存放在資料庫中的部分程式碼之前未接觸過不是很熟悉,不過也很簡單。整個程式碼部分也沒什麼有難度的地方。畢竟運氣好的是這個網易也沒有設定反爬蟲,或者說設定了反爬蟲讓我爬取下來的資料都不是原始資料。。。。稍微檢查了一下應該是沒太大問題的。