zoukankan      html  css  js  c++  java
  • Python爬虫简单入门及小技巧

    刚刚申请博客,内心激动万分。于是为了扩充一下分类,随便一个随笔,也为了怕忘记新学的东西由于博主十分怠惰,所以本文并不包含安装python(以及各种模块)和python语法。

    目标

    前几天上B站时看到一部很好玩的番剧,名字《笨女孩》,实际上是由同名的搞笑向漫画动画化的。大家都知道动画一般一周一更,很难满足我们的需求,所以我们就来编写一个爬虫,来爬取漫画咯。

    那么本文的目标就是爬取《初音MIX》这部漫画(因为笨女孩我已经爬取过了>_<)。这部漫画我记得是小学的时候看的,也是我第一次接触日漫。

    网上有很多的漫画网站,我们就选漫画之家好了!

    Miku MIX

    需要的模块

    request     用于下载网页

    re       python自带的正则模块

    BeautifulSoup  用于解析html,让我们查找元素更方便(不过这次没用上)

    开始!

    Step1:确定需要爬取的网页地址

    熟练运用网站的搜索工具,进入检索页面http://manhua.dmzj.com/tags/search.shtml?s=初音Mix

    我们找到了目标地址http://manhua.dmzj.com/chuyinmix

    接下来打开CH001,看到我们要爬取的图片

    对图片网页进行分析(F12打开自带工具),以便我们查出图片的链接

    很快查到图片链接及链接在代码中的位置

    但是当我们查看源代码时,并没有找到此标签

    因为爬虫爬取的页面是静态的html文件,没有经过其他脚本的“加工”。所以动态的脚本之类是无法作用的(PhantomJS,Selenium之类除外)。但是作为爬虫入门文章,我们还是考虑“绕过”这种烦人的东西,“绕过”方法作为一个小技巧

    技巧一:若爬取网页较困难时,尝试爬取手机网页

    很轻松的找到手机的检索地址http://m.dmzj.com/search/初音mix.html

    它的界面是这样的

    (手机上的网站在电脑上看真low。。。)

    很轻松的找到详细页面http://m.dmzj.com/info/chuyinmix.html

    这时再打开CH001,查看网页源代码,找到这么一段

    mReader.initData({"id":12777,"comic_id":6132,"chapter_name":"CH001","chapter_order":10,"createtime":1284436621,
    "folder":"c/u521du97f3MIKU/CH001","page_url":["https://images.dmzj.com/c/u521du97f3MIKU/CH001/001.jpg",
    "https://images.dmzj.com/c/u521du97f3MIKU/CH001/002.png", ...

    这么明显的地址,真的是毫无防备。。。

    那么我们找到了图片位置,可以开始爬取了

    Step2:从检索页面到详细页面再到图片页面,进行爬取

    通过简单的操作得到python代码

     1 #!usr/bin/env python
     2 #coding=utf-8
     3 import requests, re
     4 from bs4 import BeautifulSoup
     5 
     6 headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", 
     7     "Referer":"http://m.dmzj.com/"}
     8 url="http://m.dmzj.com/info/chuyinmix.html"
     9 html=requests.get(url, headers=headers)
    10 soup=BeautifulSoup(html.content, "lxml")
    11 print(soup.prettify())

    这里简单的介绍一下最常见的,最基础的,同时也最容易被绕过的反爬虫操作

    在Http协议中,客户端通过发送Http请求头来请求网页。

    在python等程序或脚本发送的请求头中user-agent并非像浏览器的一样,他们就像是“python-requests/2.14.2”。

    而一般浏览器的user-agent就像“Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0”。

    这样服务器就可以通过user-agent来区别爬虫和浏览器。

    但是我们也可以通过修改请求头来绕过,然而服务器也不傻,他们又顺便检查了请求头Referer这一项。

    Referer指的是浏览器通过哪一页面打开当前页面。

    就像通过百度搜索“初音我老婆”,任意点开一个页面时Referer就记录着百度搜索结果的页面地址。

    当然我们也可以修改Referer呵呵。

    运行后可以看到此页面的源代码。

    这时通过正则表达式来查找所需内容。

    #!usr/bin/env python
    #coding=utf-8
    import requests, re
    
    headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", 
        "Referer":"http://m.dmzj.com/"}
    urlRoot="http://m.dmzj.com/info/chuyinmix.html"
    urlPre="http://m.dmzj.com/view/6132/"
    html=requests.get(urlRoot, headers=headers)
    nameList=re.findall('(?<=chapter_name":")[^"]+', html.text);
    idList=re.findall('(?<="id":)[^,]+', html.text);
    for i in range(15):
        url=urlPre+idList[i]+".html"
        html=requests.get(url, headers=headers)
        print(html.text)

    运行结果显示没问题,于是开始尝试爬取一张图片

     1 #!usr/bin/env python
     2 #coding=utf-8
     3 import requests, re, os
     4 
     5 headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", 
     6     "Referer":"http://m.dmzj.com/"}
     7 urlRoot="http://m.dmzj.com/info/chuyinmix.html"
     8 urlPre="http://m.dmzj.com/view/6132/"
     9 html=requests.get(urlRoot, headers=headers)
    10 nameList=re.findall('(?<=chapter_name":")[^"]+', html.text);
    11 idList=re.findall('(?<="id":)[^,]+', html.text);
    12 for i in range(15):
    13     url=urlPre+idList[i]+".html"
    14     html=requests.get(url, headers=headers)
    15     print(html.text)
    16     urlList=re.findall('https:\\/\\/[^"]+', html.text)
    17     for idx, string in enumerate(urlList):
    18         img=requests.get(string.replace(r"/", "/").encode().decode("unicode-escape"), headers=headers)
    19         ext=string.split(".")[-1]
    20         if not os.path.exists(nameList[i]):
    21             os.mkdir(nameList[i])
    22         file=open(nameList[i]+"\%03d.%s"%(idx, ext), "ab")
    23         file.write(img.content)
    24         file.close()
    25         break
    26     break


    技巧二:利用str.encode().decode("unicode-escape")转换url中的Unicode编码看来成功了呵呵 >_<

    于是放开手脚,全部爬取

     1 #!usr/bin/env python
     2 #coding=utf-8
     3 import requests, re, os
     4 
     5 headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", 
     6     "Referer":"http://m.dmzj.com/"}
     7 urlRoot="http://m.dmzj.com/info/chuyinmix.html"
     8 urlPre="http://m.dmzj.com/view/6132/"
     9 html=requests.get(urlRoot, headers=headers)
    10 nameList=re.findall('(?<=chapter_name":")[^"]+', html.text);
    11 idList=re.findall('(?<="id":)[^,]+', html.text);
    12 for i in range(15):
    13     url=urlPre+idList[i]+".html"
    14     html=requests.get(url, headers=headers)
    15     urlList=re.findall('https:\\/\\/[^"]+', html.text)
    16     for idx, string in enumerate(urlList):
    17         img=requests.get(string.replace(r"/", "/").encode().decode("unicode-escape"), headers=headers)
    18         ext=string.split(".")[-1]
    19         if not os.path.exists(nameList[i]):
    20             os.mkdir(nameList[i])
    21         file=open(nameList[i]+"\%03d.%s"%(idx, ext), "ab")
    22         file.write(img.content)
    23         file.close()

    一分钟后,爬取成功>_<

    总结本次爬取简单使用了python的requests, re, os库,简单介绍了HTTP请求头和最常见的反爬虫机制,纯属娱乐凑文章哈哈

  • 相关阅读:
    python标准库之MultiProcessing库的研究 (1)
    python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结
    ASP.NET平台下从浏览器地址栏输入之后发生的事
    async & await 异步编程的一点巧方法
    【MySQL】MySQL一主二从复制环境切换主从库
    【MySQL】MySQL基于二进制文件安装
    【MySQL】MySQL半同步复制
    【MySQL】MySQL搭建主主复制(双主复制/DUAL Master)环境
    【MySQL】MySQL复制
    【MySQL】MySQL搭建主从复制环境
  • 原文地址:https://www.cnblogs.com/tanglizi/p/7420757.html
Copyright © 2011-2022 走看看