博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell爬取知乎某问题下所有图片
阅读量:5915 次
发布时间:2019-06-19

本文共 2824 字,大约阅读时间需要 9 分钟。

1. 分析网络请求

  1. 在Bash下使用curl分析网页源码,以这个问题 '' 为例
  2. –user-agent “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” ‘’

(上一步得到的代码) | egrep -o 'data-original="' | egrep -o 'https://' | sort | uniq

通过返回的内容可以看到只包含了前三个问题的url

  1. 使用chrome的debug分析网络请求发现除上面的内容外,其余的内容都是通过一个API接口实现的,并且图片是懒加载的,但是只要能获取图片的地址就能下载

image

而我们用到的变量仅有下面这两个
questions/${question_num}/answers,offset=23
当每次点击加载,都会获取20个回答
image

  1. 用curl测试,发现返回了错误,并不是debug中预想的那样
    {"error": {"message": "u8bf7u6c42u5934u6216u53c2u6570u5c01u88c5u9519u8bef", "code": 100, "name": "AuthenticationInvalidRequest"}}

继续分析,在request header中又发现了这样的字段 authorization: oauth

添加上
curl –user-agent ‘XXX’ -H ‘authorization: oauth c3cef7c66a1843f8b3a9e6a1e3160e20 ‘ ‘api_url’
这次返回了正常的JSON格式的数据,思路就很清晰了

2. 编写代码

  1. 思路是这样通过修改offset,来获取所有的回答,并提取出HTML代码中的图片地址,用wget进行下载
  2. 要注意的问题:如果不控制线程,服务器配置又不高,很容易资源耗尽,弄挂服务器
#!/bin/bash# download.sh# 爬取知乎某问题下的所有图片# 使用 ./download.SH https://www.zhihu.com/question/XXXXXXif [ ! $1 ]then    echo 'need question url'    exit 1fi# 获取问题numques_num=`echo $1 | egrep -o '[0-9]+'`function gethtml(){    curl --user-agent 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' -H 'authorization: oauth c3cef7c66a1843f8b3a9e6a1e3160e20' $1}gethtml $1 | egrep -o 'data-original="[^"]*' | egrep -o 'https://[^ ]*'| sort |uniq >> $$.logapi="https://www.zhihu.com/api/v4/questions/${ques_num}/answers?sort_by=default&include=data%5B%2A%5D.is_normal%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Cmark_infos%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=20&offset="# 根据offset获取图片链接到$$.logoffset=3total=`gethtml $api$offset | egrep -o '"totals": [0-9][^,]*' | egrep -o '[0-9]+'`total=`expr $total + 20`api_html=''for((offset=3;offset<$total;offset+=20))do    api_html=`echo $api${offset}`    gethtml $api_html| egrep -o 'data-original=\\"[^\]*' | egrep -o 'https://[^ ]*'|sort|uniq>>$$.log &donewaitecho 'get img url complete'max_th=50 #指定最大线程数,防止过多进程过分消耗资源# 线程控制function getimg(){    if [[ $max_th -ge $((`ps | grep download.sh | wc -l` - 1)) ]] # 减一是前去‘grep fileme'的行    then        {                      wget $url        }&    else            getimg    fi}# 下载图片for url in `cat $$.log`do    getimgdonewaitecho 'downlad complete'

3. 展示图片

将下载下来的图片,写个脚本放进网页中,然后愉快的...(当然之前的html代码是要自己写的,要用lazy加载哦,因为图片太多...)

#!/bin/bash#将图片链接写到网页中去for name in `ls | egrep -o '[a-z0-9]+\.(jp|jpe|pn)g'`do        echo '
  • 'doneecho ' '

    1. "

    转载地址:http://eyzvx.baihongyu.com/

    你可能感兴趣的文章
    微软Windows主管:WP今年不是我们的重点
    查看>>
    纯科普篇!安全防盗电子围栏这些事儿
    查看>>
    百会CRM:大数据和云计算引爆智能化变革
    查看>>
    走向5G时代功在技术之外
    查看>>
    JAVA之抽象类与接口的区别
    查看>>
    2021年3GPP物联网标准将占蜂窝物联网无线节点出货量一半以上
    查看>>
    【云和恩墨大讲堂电子期刊】挑战者:Google成功的背后
    查看>>
    Oracle 12c的一些新等待事件
    查看>>
    微博已跨过“历史三峡”?
    查看>>
    加拿大三分之二的电力供应来自可再生能源
    查看>>
    AngularJS —— 使用模块组织你的代码 【已翻译100%】(2/3)
    查看>>
    android.support.v7.widget.SwitchCompat
    查看>>
    白话composer的简单使用
    查看>>
    SPI机制与策略模式
    查看>>
    使用 Docker 和 Traefik 搭建 GitLab (前篇)
    查看>>
    如何让mysql索引更快一点
    查看>>
    免费logo创建器launchaco
    查看>>
    从拥挤的兔子到伪随机数算法
    查看>>
    随便写写
    查看>>
    kotlin 中 Collection 相关操作
    查看>>