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)这个地方主要是数据存放在数据库中的部分代码之前未接触过不是很熟悉,不过也很简单。整个代码部分也没什么有难度的地方。毕竟运气好的是这个网易也没有设置反爬虫,或者说设置了反爬虫让我爬取下来的数据都不是原始数据。。。。稍微检查了一下应该是没太大问题的。

你可能感兴趣的:(python学习)