python3 爬虫 零基础快速上手(爬

发布时间:2019-08-24 09:22:56编辑:auto阅读(1665)

    (补1:由于csdn页面重构了,看到有很多人浏览,特地更新一下获取内容补充的字都为绿字)

    Python是一种面向对象的解释型计算机程序设计语言,类似c,java ,php,JavaScript一种语言,比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。Python是一种高级的语言。

    一:python 安装:首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.6对应的64位安装程序32位安装程序

     

    特别要注意勾上Add Python 3.6 to PATH,然后点“customize installation"

    点击Next

    (补1:当在安装过程中出现报错,0x80072f7d,在安装时最后两项 和debugging相关的不要打勾,好像是和VS2015有关)

    Install

    运行Python

    安装成功后,打开命令提示符窗口,敲入python后,会出现两种情况:

     

     

     

     

    看到上面的画面,就说明Python安装成功!

    你看到提示符>>>就表示我们已经在Python交互式环境中了,可以输入任何Python代码,回车后会立刻得到执行结果。现在,输入exit()并回车,就可以退出Python交互式环境(直接关掉命令行窗口也可以)

    注意:命令行退出可能习惯用ctrl +C,这时用

    会报错,,,退出用exit()就可以了。

    但还可以得到一个错误:

    ‘python’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

     

    这是因为Windows会根据一个Path的环境变量设定的路径去查找python.exe,如果没找到,就会报错。如果在安装时漏掉了勾选Add Python 3.6 to PATH,那就要手动把python.exe所在的路径添加到Path中。

    添加路径:在菜单中打开系统菜单 点选 计算机->属性->系统

     

    添加完成在cmd再次输入python,就可以了。

    二:python 安装 第三方库

    确保安装时勾选了pipAdd python.exe to Path

    现在下载几个需要常用的第三方库

    启动cmd 输入pip

     

    表示pip 可以使用

     

    安装Pillow:PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。

    $ pip install pillow

     

     

     

    安装requests:内置的urllib模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能.更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便

    $ pip install requests

     

     

     

     

    安装beautifulsoup4:Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据

    $ pip install beautifulsoup4

     

    安装lxml:xml是Python中与XML及HTML相关功能中最丰富和最容易使用的库。lxml并不是Python自带的包,而是为libxml2和libxslt库的一个Python化的绑定。

     

    $ pip install lxml

    安装matplotlib:Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

     

    $ pip install matplotlib

     

     

    接下来进入正题:

    以上准备都是给这边做基础

    http://blog.csdn.net/s740556472/article/details/78239204

    从git上下载下来,

    https://github.com/unlimitbladeworks/spider_csdn.git

     

    下载下来

     

    找到路径启动python解释器

     

    在python解释器中

    ctrl +O 打开目录,找到下载的文件,选中csdn.py 打开

     

     

     

    在这我厚颜无耻的把代码抄了过来,为了表示对原作者的尊敬,原参数链接我就不进行修改了,

     

    #coding = utf-8
    import requests
    from bs4 import BeautifulSoup as bs
    import re
    import time
    
    # 访问我的博客
    def spider(url, headers):
        r = requests.get(url=url, headers=headers)
        html = r.text
        # 解析html代码
        soup = bs(html, 'lxml')
        ul = soup.find(name='ul', attrs={'id': 'blog_rank'})
        # 获取ul下的第一个li节点,正则表达式需要字符串,所以转化一下
        li = str(ul.find_next('li'))
        numbers = re.findall(r'span>(.+?)次</', li)
        # print(numbers)
        # 获取当前年月日
        date = time.strftime("%Y-%m-%d", time.localtime())
        # 拼接日期
        numbers.append(date)
        text_save(numbers, 'visitorNumber.txt')
        print('成功执行!')
    
    # 文件存储
    def text_save(content, filename, mode='a'):
        # Try to save a list variable in txt file.
        file = open(filename, mode)
        for i in range(len(content)):
            # 如果索引为最后一位,去掉空格且拼上换行符,否则剩下的后面拼接逗号
            if i == len(content) - 1:
                number = (content[i]) + '\n'
            else:
                number = str(content[i]) + ','
            file.write(number)
        file.close()
    
    
    if __name__ == '__main__':
    
        url = "http://blog.csdn.net/s740556472/article"
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
            'Cache-Control': 'max-age=0',
            'Connection': 'keep-alive',
            'Host': 'blog.csdn.net',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
        }
        spider(url, headers)

    (补:由于CSDN页面改版,之前的方法解析不到,特此此补充最新的)

    #coding = utf-8
    import requests
    from bs4 import BeautifulSoup as bs
    import re
    import time
    import json
    
    # 访问我的博客
    def spider(url, headers):
        r = requests.get(url=url, headers=headers)
        html = r.text
        # 解析html代码
        soup = bs(html, 'lxml')
        #print(soup);
        #ul = soup.find(name='ul', attrs={'class': 'mod_my_t clearfix'})
        ul = soup.find('div', attrs={'class':'grade-box'})
        #uli=ul.find_next_siblings('li')
        print(ul);
        #查看bs4的文档 find 方法 查找元素,find_next_siblings获取兄弟元素
        text=ul.find("dt", text="访问:").find_next_siblings();
        
        print(text);
        
        t=text[0];
        print(t)
        #将Tag元素转为字符串
        t3=str(t);
        #上面的find是bs4的方法,这里的是字符串的find
        t0=t3.find("title=",0,len(t3))
        t1=t3.find(">", 0, len(t3))
        
        print(t0);
        print(t1);
        #截取数字
        numbers=t3[t0+7:t1-1];
        print(numbers);
        #将字符串类型转列表
        numbers=numbers.split(" ")
        #text1=soup.find_all("dt", text="访问:")
        #print(text1);   
        # 获取当前年月日
        date = time.strftime("%Y-%m-%d", time.localtime())
        # 拼接日期
        numbers.append(date)
        text_save(numbers, 'raningDate.txt')
        print('成功执行!')
    
    # 文件存储
    def text_save(content, filename, mode='a'):
        # Try to save a list variable in txt file.
        file = open(filename, mode)
        for i in range(len(content)):
            # 如果索引为最后一位,去掉空格且拼上换行符,否则剩下的后面拼接逗号
            if i == len(content) - 1:
                number = (content[i]) + '\n'
            else:
                number = str(content[i]) + ','
            file.write(number)
        file.close()
    
    
    if __name__ == '__main__':
    	
        url = "https://blog.csdn.net/ruiti/article/details/82715601"
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate, sdch',
            'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
            'Cache-Control': 'max-age=0',
            'Connection': 'keep-alive',
            'Host': 'blog.csdn.net',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
        }
        spider(url, headers)
    

    (补1:其中很多的当时测试的注释打印没有删除,希望可以帮助你的理解)

    F5键 启动程序就执行了!(补1:结果应该是不变的)

     

    此代码执行完成!

     

    接下来就是去代码里看如何实现程序的了!

    原文使用windows每天定时执行脚本生成一个类似日志的文件

     

    感兴趣的小伙伴可以自己去原本看,链接在上面,我们现在用python写一个小脚板,让他一次性生成一个这样的txt内容

    在解释器页面ctrl+N新建一个文件,上代码

     

    # -*- coding: utf-8 -*-
    
    
    import datetime # 提供操作日期和时间的类
    import random   # 提供随机数类
    
    
    print ("开始注入数据")
    
    try:
        fobj=open("drnData.txt",'a')                        # 这里的a意思是追加,这样在加了之后就不会覆盖掉源文件中的内容,如果是w则会覆盖。
    except IOError:
        print ('*** file open error create')
    else:  
           
        for index in range(20):                         #for 循环生成20条数据
            randNum=random.randint(0,10)                #随机一个0-10的数
            randNUm=randNum+index*10                    #为了让随机的数是越来越大
            cur_date = datetime.datetime(2017, 10, 19) + datetime.timedelta(index) #获取日期函数 其实日期datetime.datetime(2017, 10, 19):2015-10-19+ 00:00:00  +datetime.timedelta(index):推迟的天数
            time_format = cur_date.strftime('%Y%m%d')   #将时间日期转换成我们需要的格式
            txtString =str(randNUm)  +","+str(time_format)#拼接字符串 将数据和日期拼接起来
            fobj.write(txtString+'\n')                  #这里的\n的意思是在源文件末尾换行,即新加内容另起一行插入。写入文件
            
        fobj.close()                              #   特别注意文件操作完毕后要close
    
    print ("注入数据结束")

     

     

    这个就是自己写的了,感觉不那么心虚了!

    保存到一个目录下,然后F5运行代码,drnData.txt生成在同目录下

     

    生成如下数据

     

     

    1,20171019
    18,20171020
    20,20171021
    35,20171022
    49,20171023
    58,20171024
    70,20171025
    72,20171026
    84,20171027
    93,20171028
    108,20171029
    120,20171030
    122,20171031
    135,20171101
    148,20171102
    155,20171103
    165,20171104
    177,20171105
    183,20171106
    193,20171107


    现在数据生成,那么我们开始将数据转换成表格

     

    现将之前下载的drawBydata.py放到数据生成的同目录下

    用解释器打开drawBydata.py,修改文件中打开文件的名称代码如下

     

    #coding=utf-8
    
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    import datetime  
    import decimal
    #根据数据动态画图
    def drawBydata():
        #读取输出的txt文档
        (recordDate,y) = readData('drnData.txt')
        #获取记录的日期列表范围(0,)
        x = range(len(recordDate))
        # plt.figure() 开始画图,r:红色
        #http://www.360doc.com/content/15/0113/23/16740871_440559122.shtml
        plt.plot(x,y,'ro-')
        #rotation,x轴字体旋转的角度
        plt.xticks(x, recordDate,rotation=70)
        plt.margins(0.08)
        plt.subplots_adjust(bottom=0.15)
        #设置x轴的名字
        plt.xlabel("Date")
        plt.ylabel("Visitors")
        #图的标题
        plt.title("My blog visit analysis") 
        plt.show()
        print('执行成功!') 
    
    #读取数据
    def readData(fileName):
        #以只读文件打开
        inFile = open(fileName,'r')
        #定义第一列数据为博客访问量
        visitors = []
        #第二列数据为日期
        recordDate = []
        #遍历文件每一行
        for line in inFile:
            #逗号分隔
            trainingSet = line.split(',')
            #将第一列和第二列数据拼入对应的列表中
            visitors.append(trainingSet[0])
            recordDate.append(trainingSet[1])
        inFile.close()
        return (recordDate,visitors)
    
    if __name__ == '__main__':
        drawBydata()
    


    点击F5运行 生成如下图像

     

     

     

     

    这是什么鬼??查了很多原因有查了下matplotlib的参数用法最后发现了bug.......

     

     

    visitors = list(map(int, visitors))
    plt.plot(x,visitors,'ro-')

     

     

     

     

     

    原因是输入的值是字符串,将字符串装为数字就可以了,得到最终图形

     

     

    完成,,有问题的小伙伴可以给我留言,,一起探讨下再见 

    (补2:有兴趣的可以看下抓取淘宝数据:

    https://blog.csdn.net/ruiti/article/details/82846768

     

     

     

     

关键字