Python爬虫——爬取股票信息

功能描述 

目标:获取证券之星股票的名称和信息 

输出:保存到文件中

使用到的模块

import urllib  
import urllib.request
import re
import random
import time

基本思路:先使用request方法读取到网页的内容,再用正则表达式匹配要查找的信息,然后保存到文件中


抓取网页:

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程。

urllib.request.urlopen()输出结果是一个 HTTPResposne 类型的对象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。 得到这个对象之后,赋值为 response ,然后就可以用 response 调用这些方法和属性,得到返回结果的一系列信息。例如 response.read() 就可以得到返回的网页内容, response.status 就可以得到返回结果的状态码,如200代表请求成功,404代表网页未找到等。


因为每一页的内容有限,要抓取更多内容就要抓取下一页的内容,但是模拟点击下一页的操作比较麻烦,所以这里利用网站的网址规则用循环来进入下一页

for page in range(1,10):
    url='http://quote.stockstar.com/stock/ranklist_a_3_1_'+str(page)+'.html'
    request=urllib.request.Request(url=url)

异常检测:

    try:       
        response=urllib.request.urlopen(request)
    except urllib.error.HTTPError as e:            
        print('page=',page,'',e.code)
        continue
    except urllib.error.URLError as e:
        print('page=',page,'',e.reason)
        continue

读取网页内容:使用response.read() 读取网页内容,并且转为gbk编码

content=response.read().decode('gbk')       
正则表达式匹配数据
    pattern=re.compile('<tbody[\s\S]*</tbody>') 
    body=re.findall(pattern,str(content))
    pattern=re.compile('>(.*?)<')
    stock_page=re.findall(pattern,body[0])      
    stock_total.extend(stock_page)

因为有些网站在短时间内连续访问就会限制访问,所以在爬取一页内容后停止几秒再爬取下一页的内容

    time.sleep(random.randrange(1,4))  
将读取到的信息写到文件中
output_file = '.\Stock.txt'    
with open(output_file,'a',encoding='utf-8') as f:
    f.write("代码\t简称\t最新价\t涨跌幅\t涨跌额\t5分钟涨幅\n")
    for i in range(0,len(stock_last),13):  #原网页有13列数据,所以步长为13
        for j in range(6):
            f.write(stock_last[i+j])
            f.write('\t')
        f.write('\n')

完整代码:

import urllib
import urllib.request
import re
import random
import time
#抓取所需内容
stock_total=[]   #stock_total:所有页面的股票数据   stock_page:某页的股票数据
for page in range(1,10):
    url='http://quote.stockstar.com/stock/ranklist_a_3_1_'+str(page)+'.html'
    request=urllib.request.Request(url=url)
    try:       
        response=urllib.request.urlopen(request)
    except urllib.error.HTTPError as e:            #异常检测
        print('page=',page,'',e.code)
        continue
    except urllib.error.URLError as e:
        print('page=',page,'',e.reason)
        continue
    content=response.read().decode('gbk')       #读取网页内容
    print('get page',page)                  #打印成功获取的页码
    pattern=re.compile('<tbody[\s\S]*</tbody>') 
    body=re.findall(pattern,str(content))
    pattern=re.compile('>(.*?)<')
    stock_page=re.findall(pattern,body[0])      #正则匹配
    stock_total.extend(stock_page)
    time.sleep(random.randrange(1,4))        #每抓一页随机休眠几秒
#删除空白字符
stock_last=stock_total[:]  #stock_last为最终所要得到的股票数据
for data in stock_total:
    if data=='':
        stock_last.remove('')
#储存部分结果为txt文档
output_file = '.\Stock.txt'     
with open(output_file,'a',encoding='utf-8') as f:
    f.write("代码\t简称\t最新价\t涨跌幅\t涨跌额\t5分钟涨幅\n")
    for i in range(0,len(stock_last),13):  #原网页有13列数据,所以步长为13
        for j in range(6):
            f.write(stock_last[i+j])
            f.write('\t')
        f.write('\n')

部分爬取结果展示:

展开阅读全文

没有更多推荐了,返回首页