美文网首页
狍子大概看得懂的简易爬虫教程

狍子大概看得懂的简易爬虫教程

作者: ylylhl | 来源:发表于2020-01-20 23:05 被阅读0次

    是说因为各种原因打算写一下!就很简单,也没打算往深里写(
    针对无基础计算机系学生的十分钟速成摸鱼特化型(笑)
    比起简易教程更像知识堆积存放处()
    将来有空可能再细化下具体操作步骤之类,毕业要紧,跑了跑了x

    如果想要对爬虫有一个系统的了解,建议读一下这篇,有时间的话强推:
    简单爬虫教程 - Zkeeer's Note
    很强,也很全,看完就不用看这个了(

    前置知识

    一点点python语法

    随便看看就好啦!A Byte of Python这本真的很好,跳过前面的废话随便看看常用语法,完全可以两小时速成python(误)
    重点大概就……算了还是列一下写简易爬虫的我流重点(

    • 读写文件(open,close)
    • 条件判断&循环(if,while,for)
    • list,dict,切片
    • 异常处理(try & except),不看也成

    别的就随便看看,真的就随便看看就成(
    简明python教程 - 中译本
    Python教程 - 廖雪峰的官方网站

    一点点编码常识

    很痛苦.jpg 一般在这里出错总会调试半天(。
    就只要知道为什么会乱码就好!基本都是GBK和UTF-8之间的转换问题,遇到再说吧……点点点。

    一点点正则表达式

    很痛苦*2,但是也只能硬啃啃……差不多能写点简单的就成,保持对知识的敬畏之心(x)
    不过话是这样说啦!实际搞的时候大家还不是都用BeautifulSoup(。好像也有用SimplifiedDoc的,无所谓了本质工具能用就ok(

    XPath也很好,但还是按部就班先学学正则,毕竟用处比较广(
    总之我把一个教程和一点工具放在这里.jpg
    正则表达式30分钟入门教程v2.4.1 - deerchao
    常用正则表达式v0.03 - deerchao
    在线正则表达式测试 - deerchao

    一点点网页小知识

    计算机学生必备常识系列其之一(并没有二)
    大概就,HTML基础知识&收包发包过程里都传了什么东西(。
    最好有掌握一点点JS不过也无所谓啦!

    辅助抓包小工具

    BurpSuite给老子冲!
    Web安全 — BurpSuite实战(上)- 红日安全团队 - Freebuf
    ……开玩笑的,狐哥,算了算了.jpg
    就……火狐好多插件嘛,或者F12也可以的,反正只是看看发包内容而已……看个人喜好了(。杀鸡焉用牛刀

    正文

    开冲之前

    很无助,但是也只能面对!总之又要学点新东西!

    也不用很认真,能get能post能encoding就成(……
    爬虫基本库:requests - 大千世界1998 - 简书
    也不用很认真*2,用的时候再查也完全okk(
    Python re模块学习 - 流年留念 - 博客园

    开冲

    虽然小标题这样说啦但是前面引用的链接里其实都写过爬虫实例了,很卑微(……)就简单写一下我流简易爬虫流程(。

    • 简单看一下html代码
    • BurpSuite抓包看看自己发的请求什么样子
    • import requests / import os / import re
    • 发请求,拿正则挑出来自己想要的东西
    • 后期处理,看需求创建&写入文件

    看到这里的话已经可以去做点练习了,大概。从这个网址开始往后两三关的样子,应该都可以做了(。
    Python Challenge

    需要的话可以搞搞多线程多进程啥的,大家都说windows应该用多进程但是也没搞很懂why(……)以及看到这里时期望能达到的程度如下:

    # -*- coding:utf-8 -*-
    '''
    ●getFiction v1.0
    
    作者:Yemu
    创建日期:19.5.21
    最近修改时间:19.5.21
    程序目的:爬个小说
    '''
    
    import requests
    import os
    import re
    
    #创建文件夹
    path='./qingchengtianxia/'
    try:
        os.makedirs(path)
    except:
        print("dir has been exist.")
        
    #给目录所在网址发请求,爬小说各章节所在网址,下面这堆参数在抓的包里都能看见
    url="https://www.biqushu.com/book_108570/"
    cookie="Hm_lvt_9222135ee421feb6803d0f143dac6ae3=1560676121,1560681067; Hm_lpvt_9222135ee421feb6803d0f143dac6ae3=1560681067; jieqiVisitId=article_articleviews%3D108570"
    headers={
        "Host": "www.biqushu.com",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cache-Control": "max-age=0",
        "Proxy-Connection": "keep-alive",
        "Cookie": cookie,
        "referer":"https://www.biqushu.com/book_108570/",
        "If-None-Match": "1560681072|",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
        }
    response = requests.get(url,headers=headers)
    #转码
    response.encoding='gbk'
    #正则
    pattern = re.findall('<li><a href="(.*?)">',response.text,re.S)
    #一点点处理
    pattern=pattern[11:]
    #创建文件并循环写入
    file=open('xiaoshuo2.txt','a')
    for i in pattern:
        #获取每一章的具体网址
        url2=url+i
        #发请求ry
        response = requests.get(url2,headers=headers)
        response.encoding='gbk'
        title = re.findall('<h1>(.*?)</h1>',response.text,re.S)
        txt = re.findall('精彩小说无弹窗免费阅读!<br><br>(.*?)</div>',response.text,re.S)
        #连接字符串&去除不必要字符
        text=title[0]+'\n'+txt[0].replace('&nbsp;','').replace(' ','').replace('\n','').replace('\r','\n').replace('<br/>','')+'\n'
        file.write(text)
        #print(title[0],'done')
    print('done')
    

    结语

    总之速成的摸鱼特化型就是这样了,大概从python零基础到完成也就三小时(x
    想要写得好一点可以看看拓展阅读或者自己再去搜一搜之类=D
    最后放一个很古老的鱼,以证清白 写散装代码误人子弟(。

    # -*- coding:utf-8 -*-
    '''
    ●A Crawler for Rengoku-teien v0.5
    
    
    Author: Yemu
    Create date: 18.9.4
    
    爬取炼狱庭园的曲子及曲子简介并自动解压
    '''
    import requests
    import re
    import os
    from zipfile import ZipFile
    import multiprocessing
    
    def dl(url,text,path):
        print("--------------------------------------")
        print("[+]connecting now...")
        if not os.path.exists("./songs/"+path+'/'+text[0]):
            os.makedirs("./songs/"+path+'/'+text[0])
        try:
            file_name="./songs/"+path+'/'+text[0]+"/"+text[0]+".txt"
            f = open(file_name, 'w')
            f.write(text[0]+text[1])
            f.close()
            print("[+]save profile successfully")
        except Exception as e:
            print("[-]write profile failed,",e)
            f=open("error.txt",'a')
            f.write("[-]write "+text[0]+" profile failed\n")
            f,close
        download_url=re.findall('<td class="songicon"><a href="(.*?)">',text[2],re.S)
        download_url=url+download_url[0]
        print(download_url)
        source2=requests.get(download_url)
        source2.encoding='utf-8'
        try:
            zip_name="./songs/"+path+'/'+text[0]+"/"+text[0]+".zip"
            f2 = open(zip_name, 'wb')
            f2.write(source2.content)
            f2.close()
            print("[+]save "+text[0]+".zip successfully")
        except Exception as e:
            print("[-]save zip failed,",e)
            f=open("error.txt",'a')
            f.write("[-]save "+text[0]+" zip failed\n")
            f,close
        print("[+]extracting now...")
        try:
            extract_zip(text[0])
        except Exception as e:
            print("[-]extract failed,",e)
            f=open("error.txt",'a')
            f.write("[-]extract "+text[0]+" zip failed\n")
            f,close
    
    
    def extract_zip(text):
        file_name="./songs/"+text+"/"+text+".zip"
        path="./songs/"+text
        with ZipFile(file_name, 'r') as zip_file:
            zip_file.extractall(path)
            print("[+]done")
            
                
    def download_zip(source):
        link=[]
        pattern = re.findall('<div class="song">(.*?)</table>',source.text,re.S)
        for i in pattern:
            song_text=re.findall('<p>(.*?)</td>',i,re.S)
            bio=song_text[0].replace("<br>","\n").split("</p>")
            bio+=[i]
            link.append(bio)
        return link
        
    if __name__=='__main__':    
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36','Accept-Encoding':'gzip'}  
        url_list=["punk","pop","wafu"]
        url = 'http://www.rengoku-teien.com/mp3/'
        for k in url_list:
            realurl=url+k+'.html'
            source=requests.get(realurl,headers=headers)
            source.encoding='utf-8'
            all_link=download_zip(source)
            print("[+]get all links")
            pool = multiprocessing.Pool(multiprocessing.cpu_count())
            for i in all_link:
                pool.apply_async(dl, (url,i,k, ))
            # pool.map(detailPage, urls)
            pool.close()
            pool.join()
            print("--------------------------------------")
            print("[+]finished")
    

    以上!感谢观看!

    拓展阅读





    相关文章

      网友评论

          本文标题:狍子大概看得懂的简易爬虫教程

          本文链接:https://www.haomeiwen.com/subject/iwqszctx.html