首先解决一下之前那篇博客遇到的关于中文乱码的问题,在sublime3中无法打印中文的问题。今天问了一个同事,帮我解决了这个问题
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
在win7中,python的
默认编码不是'utf-8',改一下python的默认编码成'utf-8'就行了。在上面那行代码中,修改了python的默认编码为utf8,并赋予了stdout输出,使得python的输出默认编码为utf8,这样在sublime中就可以使用print函数正常打印中文了。
好了,现在进入今天的正题,今天学习了一个用python爬虫新浪股票信息的程序,拿出来跟大家分享。
首先还是引入需要的模块和设置标准输出编码
# -*- coding:utf-8 -*-
# 需要打印中文字符
import io
import sys
import requests
import threading
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
这些代码的意思不用说了。接着我们需要定义几个函数,由于在这个程序里需要使用多线程编程,因此需要引入threading的模块,这个模块在python3中做了一些修改,有关python2和python3的区别我会在另外一篇文章中说明。
接下来是定义三个函数。
def displayInfo(code):
url = 'http://hq.sinajs.cn/list=' + code
response = requests.get(url).text
print(response)
def singleThread(codes):
for code in codes:
code = code.strip()
displayInfo(code)
def multiThread(tasks):
threads = []
for task in tasks:
threads.append(threading.Thread(target = singleThread, args = (task, )))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
第一个函数displayInfo主要是打印出来程序运行的结果,这里面使用了一个模块requests,来对网络中的内容进行请求。之前曾经用过urllib这个模块,但是由于urllib这个模块会有一个漏洞,同时封装的也不是很好,现在大家都已经摒弃了urllib,而改用requests模块了。我们这里只要打印纯文本就好。
第二个函数是把每一支股票都调用displayInfo来打印出来,这里每一支股票都有唯一的一个code。我这里遵循的原则就是尽量一个函数只做一件事情,这样函数的封装和复用会比较好。
第三个函数是启用多进程。首先是根据参数tasks中元素的数量来确定启几个进程,之后分别启动进程,然后等待进程结束。
最后一部分代码就是调用这个三个函数,其实只是调用第三个函数而已。
if __name__ == '__main__':
codes = ['sh600001', 'sh600002', 'sh600003', 'sh600004', 'sh600005']
thread_len = int(len(codes) / 4)
t1 = codes[0 : thread_len]
t2 = codes[thread_len : thread_len * 2]
t3 = codes[thread_len * 2 : thread_len * 3]
t4 = codes[thread_len * 3 : ]
multiThread([t1, t2, t3, t4])
首先给一个main函数入口,然后构造codes数组,之后把codes数组作为参数传入multiThread中,调用该函数,去新浪中查找想要的数据。下面是最后的运行结果。
这个网络爬虫程序算是比较简单了,并没有设置head去爬数据,所以很容易被有些网站认为爬虫程序而被拒绝。今天的小例子只是想和大家一起体会一下爬虫是个什么东西,同时这里也用到了多线程编程,这也是python语言的一个特点。
今天的内容就是这些了。
与您共勉!