Eric的新家

导航

七月在线爬虫班学习笔记(一)

早就购买了这个课程,但是却一直拖着没看。最近不在北京实习,重新回到成都,回到学校才有心继续学习。研究生的日子不多了,希望自己能好好利用起来。七月在线的地址:https://www.julyedu.com/ 。这个七月在线的平台我觉得还行,里面有收费的也有免费的课程,适合对机器学习、人工智能感兴趣的同学。大家可以去看看。该课程共有八次课。第课内容如下:

  1. 爬虫简介及Python开发爬虫的优势
  2.  Python简介及开发环境安装
  3. HTTP/JSON/XML简介
  4. MySQL/SQLLite介绍与配置
  5. 爬虫框架介绍
  6. Robots协议
  7. ip138邮编抓取实战
  8. 多线程抓取新浪股票 数据

1.爬虫简介及Python开发爬虫的优势

2.Python简介及开发环境安装

我在window10 下直接使用的是anaconda3。比较方便。安装了虚拟机Linux环境下都会自带Python。我这里懒得打字直接剪切了ppt的内容。

3.HTTP/JSON/XML简介

大家在编写爬虫的过程中一定会使用到网络相关的知识,以及分析网页从而去提取相关的信息,所以了解http,以及json、xml这些都是有必要的。

 

 

 

4.MySQL/SQLLite介绍与配置

 

 

 

 5.爬虫框架介绍

 6.Robots规范介绍

 

 7.ip138邮编抓取实战

最后这两个代码的实例都是可以运行的,并且当时老师是直播手写代码,思路非常的清晰。下面是代码。

 

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])

 

posted on 2018-05-07 14:39  Eric的新家  阅读(336)  评论(0编辑  收藏  举报