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

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

作者: 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