Python 爬虫实战(2)

Dec 19, 2017 | 爬虫
文章目录
    • Python 爬虫实战2

      • 目标 获取上交所和深交所所有股票的名称和交易信息存储到一个本地文件中

        • python文件读写
      • 个人代码
      • 别人家的代码滑稽

目标: 获取上交所和深交所所有股票的名称和交易信息,存储到一个本地文件中

网站选择原则: 股票信息静态存在于html页面中,非js代码生成,没有Robbts协议限制

选取方法: 打开网页,查看源代码,搜索网页的股票价格数据是否存在于源代码中

  • 下面的百度股市通中,股票的信息完全再html代码中,符合要求(并且发现网址中包含我们需要的关键字:sz代表深交所,而后面的数字就是股票代码了)

输出结果 输出结果

  • 除了单个股票的信息,我们需要所有交所和深交所的股票,访问 http://quote.eastmoney.com/stocklist.html 查看页面

股票代码

  • 所有我们只需要先获取所有的股票代码,然后循环访问百度即可获得所有的股票信息

输出结果:

输出结果

大部分讲解都在 Python 爬虫实战(1) 中介绍过了,需要请查看 http://blog.zj2626.com/2017/12/14/20171214_crawler

python文件读写

  • Python内置了读写文件的函数,用法和C是兼容的。

在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

读文件

  • python内置的open()函数,返回一个文件对象;(参数中 r代表读 w代表写)

读文件

  • 得到文件对象,则可以直接调用f.read()把文件内容读取到内存中来

    1
    f.read()

读取时发生的问题:

  1. 如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在
  2. ‘gbk’ codec can’t decode byte 0xaf in position …
12345
#问题2解决方案两个:# 1. 打开文件的时候就指定编码的类型    f = open('E:/Data.txt', 'r',encoding = 'utf-8')    f.read()# 2. 修改文件编码为utf-8
  • 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
1
f.close()
  • 为了防止中途出现异常而无法关闭文件,使用try finally语句
123456
try:    f = open('E:/Data.txt', 'r', encoding = 'utf-8')    print(f.read())finally:    if f:        f.close()
  • 为了简化代码,python提供了一个更好的更简洁的方法读取文件(和try…finally一样的)
12
with open('E:/Data.txt', 'r', encoding = 'utf-8') as f:    print(f.read())
  • read()方法一次把所有的文件内容读取进来,如果文件太大就不太好用,所以要反复调用read(size)来一部分一部分的读取,也可以调用readline()一次读取一行,或者调用readlines()一次读取全部并返回list

    1234
    with open('E:/Data.txt', 'r', encoding = 'utf-8') as f:    print(f.readline())    print(f.readline())    print(f.readline())

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便

写文件

  • 第二个参数传入标识符’w’或者’wb’表示写文本文件或写二进制文件; write()函数会把数据替换掉原文件中内容

    123456
    try:    f = open('E:/Data.txt', 'w', encoding = 'utf-8')    f.write('ffffffffffffffffffffffff')finally:    if f:        f.close()

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

  • 同读取一样 系统提供更好的

    12
    with open('E:/Data.txt', 'w', encoding = 'utf-8') as f:    f.write('kkkkkkkkkkkkkkkk')

二进制文件

  • 前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件即可
12
with open('D:/20171226101748.png', 'rb') as f:    f.read()

个人代码:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
from urllib import requestfrom bs4 import BeautifulSoup as bsimport re

def getCodes():    url = 'http://quote.eastmoney.com/stocklist.html';    resp = request.urlopen(url)    resp_text = resp.read().decode('gbk')    soap = bs(resp_text, 'html.parser')    list = soap.find_all('div', id = 'quotesearch')[0].find_all('ul')[0].find_all('li')

    codeList = []    for li in list:        try:             #eg: sh603183            codeList.append(re.findall(r"[s][hz]\d{6}", li.find('a')['href']))        except:            continue

    return codeList

def makeDict(code):    infoDict = {}    url = 'https://gupiao.baidu.com/stock/'+ code +'.html';    resp = request.urlopen(url)    resp_text = resp.read().decode('utf-8')    soap = bs(resp_text, 'html.parser')

    try:        stockInfo = soap.find_all(attrs = {'class','stock-bets'})        name = soap.find(attrs = {'class', 'bets-name'})        if name is None:            return None        infoDict['name'] = name.text.strip()        keys = soap.find_all('dt')        values = soap.find_all('dd')        for i in range(len(keys)):            infoDict[keys[i].text] = values[i].text

        return infoDict    except:        return None

def writeFile(codeList):    i=0    for code in codeList:        i = i+1        # 下面两个判断是因为前45个股票百度并没有信息,所以跳过了,200个以后的数据就不再取了,太多了,科科        if i < 45:            continue        if i > 200:            break        infoDict = makeDict(code[0])        if infoDict is None:            continue        print (infoDict)        with open('E://Data.txt', 'a', encoding = 'utf-8') as f:            f.write(str(infoDict) + '\n')

codeList = getCodes();print("start")writeFile(codeList)

别人家的代码【滑稽】:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
# -*- coding: utf-8 -*-

import requestsfrom bs4 import BeautifulSoupimport tracebackimport re

def getHTMLText(url):    try:        r = requests.get(url)        r.raise_for_status()        r.encoding = r.apparent_encoding        return r.text    except:        return ""

def getStockList(lst, stockURL):    html = getHTMLText(stockURL)    soup = BeautifulSoup(html, 'html.parser')     a = soup.find_all('a')    for i in a:        try:            href = i.attrs['href']            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])        except:            continue

def getStockInfo(lst, stockURL, fpath):    count = 0    for stock in lst:        url = stockURL + stock + ".html"        html = getHTMLText(url)        try:            if html=="":                continue            infoDict = {}            soup = BeautifulSoup(html, 'html.parser')            stockInfo = soup.find('div',attrs={'class':'stock-bets'})

            name = stockInfo.find_all(attrs={'class':'bets-name'})[0]            infoDict.update({'股票名称': name.text.split()[0]})

            keyList = stockInfo.find_all('dt')            valueList = stockInfo.find_all('dd')            for i in range(len(keyList)):                key = keyList[i].text                val = valueList[i].text                infoDict[key] = val

            with open(fpath, 'a', encoding='utf-8') as f:                f.write( str(infoDict) + '\n' )                count = count + 1                print("\r当前进度: {:.2f}%".format(count*100/len(lst)),end="")        except:            count = count + 1            print("\r当前进度: {:.2f}%".format(count*100/len(lst)),end="")            continue

def main():    stock_list_url = 'http://quote.eastmoney.com/stocklist.html'    stock_info_url = 'https://gupiao.baidu.com/stock/'    output_file = 'D:/BaiduStockInfo.txt'    slist=[]    getStockList(slist, stock_list_url)    getStockInfo(slist, stock_info_url, output_file)

main()

转载自 链接地址: http://python.jobbole.com/88350/

个人博客 欢迎来访: http://blog.zj2626.com

python 爬虫
Python 爬虫实战(3) Python 爬虫实战(1)

Python 爬虫实战(2)相关推荐

  1. 线程,协程对比和Python爬虫实战说明

    此文首发于我的个人博客:线程,协程对比和Python爬虫实战说明 - zhang0peter的个人博客 这篇文章写的是我对线程和协程的理解,有错误之处欢迎指出. 举一个餐馆的例子.我们把一个餐厅当做一 ...

  2. python爬虫图片实例-【图文详解】python爬虫实战——5分钟做个图片自动下载器...

    我想要(下)的,我现在就要 python爬虫实战--图片自动下载器 之前介绍了那么多基本知识[Python爬虫]入门知识(没看的赶紧去看)大家也估计手痒了.想要实际做个小东西来看看,毕竟: talk ...

  3. python爬虫项目-32个Python爬虫实战项目,满足你的项目慌

    原标题:32个Python爬虫实战项目,满足你的项目慌 爬虫项目名称及简介 一些项目名称涉及企业名词,小编用拼写代替 1.[WechatSogou]- weixin公众号爬虫.基于weixin公众号爬 ...

  4. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  5. Python爬虫实战(5):模拟登录淘宝并获取所有订单

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  6. Python爬虫实战(4):抓取淘宝MM照片

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  7. Python爬虫实战(3):计算大学本学期绩点

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  8. Python爬虫实战之(五)| 模拟登录wechat

    作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一 ...

  9. Python爬虫实战之(五)| 模拟登录wechat 1

    作者:xiaoyu 微信公众号:Python数据科学 知乎:Python数据分析师 不知何时,微信已经成为我们不可缺少的一部分了,我们的社交圈.关注的新闻或是公众号.还有个人信息或是隐私都被绑定在了一 ...

  10. qq纵横四海源码_【0基础】纵横中文网python爬虫实战

    原文在此~ [0基础]纵横中文网python爬虫实战​mp.weixin.qq.com 大家好,我是你们的机房老哥! 在粉丝群的日常交流中,爬虫是比较常见的话题.python最强大的功能之一也是爬虫. ...

最新文章

  1. MySQL多实例学习笔记
  2. PMCAFF微课堂|猎豹清理大师亿万用户量产品背后的紫牛方法论,傅盛不会说的秘密...
  3. 再见,2014;您好,2015!
  4. PAT1006 换个格式输出整数
  5. Django(part19)--Django中的应用
  6. apache.camel_Apache Camel 2.9发布–十大变化
  7. 云原生时代,开发者如何构筑容器安全?
  8. cross validation交叉验证
  9. Java基础篇之什么是CharArrayReader
  10. maven的基本用法
  11. 高中信息技术—Python常见关键字及函数中英文对照
  12. 【Vue】前端跨域解决方法
  13. 推荐系统实践 - 02利用用户行为数据
  14. ubuntu 18 安装显卡驱动时卡死及系统重装
  15. King Arthur's Knights 【HDU - 4337】【哈密顿回路性质Dirac定理】
  16. Unreal Engine 4学习资料整理
  17. Socket编程面试问题
  18. 微信小程序 - 小技巧
  19. greasemonkey_Greasemonkey –在任何页面上执行自定义JavaScript
  20. [护肤] 去皱汇总+19个民间小偏方

热门文章

  1. 计算机与linux基础
  2. InsightFace又出新作!合成更真实更多样近红外人脸图片,助力“近红外-可见光”跨域人脸识别...
  3. 常见的逻辑思维面试题
  4. 石墨笔记,为知笔记和Effie哪个更适合学生?
  5. 使用uniapp注册全局组件
  6. 电容笔和触控笔有什么区别?第三方电容笔了解下
  7. 微信营销辅助工具能够帮助我们解锁哪些新功能?
  8. Windows简体系统和繁体系统下的乱码处理
  9. 8.19! 今天我有18生日,点击阅读或顶部 尾随幸运的一天!生日知识!↓——【Badboy】...
  10. 调试技巧:如何以数组的方式查看一个指针