七月在线爬虫班学习笔记(一)
早就购买了这个课程,但是却一直拖着没看。最近不在北京实习,重新回到成都,回到学校才有心继续学习。研究生的日子不多了,希望自己能好好利用起来。七月在线的地址:https://www.julyedu.com/ 。这个七月在线的平台我觉得还行,里面有收费的也有免费的课程,适合对机器学习、人工智能感兴趣的同学。大家可以去看看。该课程共有八次课。第课内容如下:
- 多线程抓取新浪股票 数据
1.
2.
3.
4.
5.
6.Robots规范介绍
7.
import requests #比urllib好用 import xml.etree.ElementTree as ET from xml.parsers.expat import ParserCreate class DefaultSaxHandler(object): def __init__(self, provinces): self.provinces=provinces # 处理标签开始 def start_element(self, name, attrs): if name != 'map': name=attrs['title'] number=attrs['href'] self.provinces.append((name, number)) # 处理标签结束 def end_element(self, name): pass # 文本处理 def char_data(self, text): pass def get_province_entry(url): # 获取文本,并用gb2312解码 content = requests.get(url).content.decode('gb2312') # print(type(content), content) # content为字符串类型 # 确定要查找字符串的开始位置,并用切片获取内容 start=content.find('<map name=\"map_86\" id=\"map_86\">') end=content.find('</map>') content=content[start:end+len('</map>')].strip() #获取所需的字段并去掉首尾的空格 # print("content:", content) provinces=[] # 生成Sax处理器, SAX(simple API for XML)是一种XML解析的替代方法, 详情百科 handler=DefaultSaxHandler(provinces) # 初始化分析器 parser=ParserCreate() parser.StartElementHandler=handler.start_element parser.EndElementHandler=handler.end_element parser.CharacterDataHandler=handler.char_data #解析数据 parser.Parse(content) # 结果字典为每一页的入口代码 return provinces provinces=get_province_entry('http://www.ip138.com/post') print("provinces:", provinces)
8.
import requests import threading def display_info(code): url='http://hq.sinajs.cn/list=' + code response=requests.get(url).text # 核心,爬下内容直接打印输出 print(response) def single_thread(codes): for code in codes: code = code.strip() display_info(code) def multi_thread(tasks): # print("tasks:", tasks) # 用列表推导生成线程,注意只有一个元素的tuple定义时必须加一个逗号! 具体参见廖雪峰的python3基础教程 "tuple" # print((['sh600007', 'sh600008', 'sh600009']), (['sh600007', 'sh600008', 'sh600009'], )) # 关于多线程这一块可查看 廖雪峰的python3基础教程 "多线程" threads = [threading.Thread(target = single_thread, args=(codes, )) for codes in tasks] # 启动线程 for t in threads: t.start() # 等待直到线程结束 for t in threads: t.join() # 注意main函数的形式 if __name__ == '__main__': codes=['sh600004', 'sh600005', 'sh600006', 'sh600007', 'sh600008', 'sh600009'] # print("len(codes):", len(codes)) # 计算每个线程要做多少工作 thread_len=int(len(codes) / 4) # print("thread_len:", thread_len) 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:] # print("t1:", t1, "t2:", t2, "t3:", t3, "t4:", t4) # 多线程启动 multi_thread([t1, t2, t3, t4])
情不知所起一往而深