女朋友说,她想学爬虫

女朋友说,她想学爬虫

女朋友说她想学爬虫,于是我先自学了一波,再来教她。
废话不多说,先上代码

import requests
import time
import urllib
import os
'''
   按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。
    所以 URL 中使用其他字符就需要进行 URL 编码。python3中使用urllib.parse.quote进行编码
'''
#keyword_quote = urllib.parse.quote(keyword)

headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36',
        'cookie':"BDIMGISLOGIN=0; winWH=%5E6_1280x578; BDqhfp=%25C9%25B3%25B5%25F1%25B1%25ED%25C7%25E9%25B0%25FC%26%26NaN-1undefined%26%260%26%261; BAIDUID=9A043585BD4CCD23E3624F9C5EBC6FA2:FG=1; BIDUPSID=9A043585BD4CCD23E3624F9C5EBC6FA2; PSTM=1569737371; H_WISE_SIDS=139701_136721_132925_128699_139421_139403_138434_139696_139211_120140_138470_140142_137758_138878_137985_131246_132552_118883_118873_118849_118828_118803_138165_139397_139810_136431_138844_139048_139283_139297_136862_138146_140120_139625_139593_136196_139304_131862_137104_139274_139399_139692_133847_137734_137468_138564_134046_131423_138510_139246_139097_110085_127969_139249_139882_139513_127417_138313_139908_138426_139732_139159_140139_135719_139927_139221_140231; indexPageSugList=%5B%22%E6%87%92%E6%B4%8B%E6%B4%8B%22%2C%22%E8%8B%8D%E8%80%81%E5%B8%88%22%2C%22%E8%BD%BF%E8%BD%A6%E5%86%85%E6%99%AF%22%2C%22%E8%BD%A6%E8%BE%86%E5%86%85%E9%83%A8%E7%BB%93%E6%9E%84%22%5D; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; PSINO=6; ZD_ENTRY=baidu; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; H_PS_PSSID=1466_21111_30480",
        "referer":"https://image.baidu.com"
        }

def aaa(i,keyword):     #找出图片的链接
    keyword=urllib.parse.quote(keyword)
    url = "http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + keyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=" + keyword + "&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&expermode=&force=&" + "pn=" + str(
        i) + "&rn=30&gsm=&1580626670403="  # "http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%C9%B3%B5%F1%B1%ED%C7%E9%B0%FC&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=000000"#"https://www.zhihu.com/question/335208105/answer/934855781"
    r1 = requests.get(url)
    r = r1.text
    r2 = r.replace('null', "'asdfg'")
    r1 = eval(r2)
    pic = []
    for k, v in r1.items():
        if k == 'data':

            for v1 in v:

                for kk, vv in v1.items():
                    if kk == 'thumbURL':
                        pic.append(vv)
    return pic

if __name__ == '__main__':
    print("请输入要下载的图片类型(比如胡歌): ", end=" ")
    skt = input()
    print("请输入要下载的页数(整数,每页30张图片): ", end=" ")
    page = int(input())
    for j in range(0, page):
        pic = aaa(j * 30, skt)
        for i in range(len(pic)):
            r = requests.get(pic[i], headers=headers, timeout=5000)
            path1 = "D:\\图片下载"
            if not os.path.exists(path1):
                os.makedirs(path1)
            path = path1 + '\\' + skt
            if not os.path.exists(path):
                os.makedirs(path)
            if not os.path.exists(path + '\\' + str(j * 30 + i + 1)):
                with open(path + "\\" + str(j * 30 + i + 1) + '.jpg', 'wb')as f:
                    f.write(r.content)
                f.close()
                print("done " + time.ctime())
            else:
                pass


说明:这一段代码可以直接粘贴复制在你的pythonIDE上运行。代码默认保存在你的D盘的 图片下载 的文件夹下。当然,你也可以自己更改路径。不信?你自己可以跑跑看

下面是对代码的简短的说明:

第一部分:


当然是导入必要的库啦,python就是以有丰富的库而著称的,嘿嘿。
上代码:

代码一

import requests    #爬虫必用的强大的抓包库
import time   #这是用来记录每次运行到哪里的库,好给我提示
import urllib  
"""
按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。所以 URL 中使用其他字符就需要进行 URL 编码。python3中使用urllib.parse.quote进行编码
"""
import os  #在电脑上建立文件夹

注意:如果没有安装requests库,可以在cmd环境下(win+r)使用命令pip install requests来解决,安装过程可能会有错误,建议耐心多下载几次,成功为止,不然你直接运行我上面的代码,可能会报错,一定要把我的代码一的所有的库安装完再来跑我上面的所有的代码


第二部分
爬虫伪装:
我在实际操作的时候发现百度对爬虫还是比较反感的,所有采取了一些措施,这个时候怎么能难倒我们这些搞爬虫的?一顿操作之下,搞了个headers头部,瞬间把baidu搞的服服帖帖的。啊哈哈哈哈哈哈哈,狂笑。
不说了,上代码:
代码二

headers={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36',
        'cookie':"BDIMGISLOGIN=0; winWH=%5E6_1280x578; BDqhfp=%25C9%25B3%25B5%25F1%25B1%25ED%25C7%25E9%25B0%25FC%26%26NaN-1undefined%26%260%26%261; BAIDUID=9A043585BD4CCD23E3624F9C5EBC6FA2:FG=1; BIDUPSID=9A043585BD4CCD23E3624F9C5EBC6FA2; PSTM=1569737371; H_WISE_SIDS=139701_136721_132925_128699_139421_139403_138434_139696_139211_120140_138470_140142_137758_138878_137985_131246_132552_118883_118873_118849_118828_118803_138165_139397_139810_136431_138844_139048_139283_139297_136862_138146_140120_139625_139593_136196_139304_131862_137104_139274_139399_139692_133847_137734_137468_138564_134046_131423_138510_139246_139097_110085_127969_139249_139882_139513_127417_138313_139908_138426_139732_139159_140139_135719_139927_139221_140231; indexPageSugList=%5B%22%E6%87%92%E6%B4%8B%E6%B4%8B%22%2C%22%E8%8B%8D%E8%80%81%E5%B8%88%22%2C%22%E8%BD%BF%E8%BD%A6%E5%86%85%E6%99%AF%22%2C%22%E8%BD%A6%E8%BE%86%E5%86%85%E9%83%A8%E7%BB%93%E6%9E%84%22%5D; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; PSINO=6; ZD_ENTRY=baidu; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; H_PS_PSSID=1466_21111_30480",
        "referer":"https://image.baidu.com"
        }

这里注意,headers头部对于一般的网站其实只需要设置user-agent,也就是

'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36'

当然这个user-agent是万能的,所有的都一样。

但是百度图片这个有点特殊,百度图片需要cookie和refere来识别是不是爬虫。

关于cookie和refere的作用自己百度查吧。这里我把headers头部的作用我觉得写的比较好的一篇文章推给大家
爬虫头部headers详解


第三部分
找寻每一张图片的url,我们发现百度图片是采用acjx异步加载的,可以说是一种动态加载方式,我们以前所有学的东西都是告诉我们静态url的爬取,但是这次百度出大招了,这里也不得不感叹前端技术的发展也是牛逼。这里就不感叹这个了。

还是上代码吧:
代码三:

def aaa(i,keyword):     #找出图片的链接
    keyword=urllib.parse.quote(keyword)  #把你输入的关键词转换为url编码
    url = "http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=" + keyword + "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=&copyright=&word=" + keyword + "&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&expermode=&force=&" + "pn=" + str(i) + "&rn=30&gsm=&1580626670403="
    r1 = requests.get(url)
    r = r1.text
    r2 = r.replace('null', "'asdfg'")
    r1 = eval(r2)  #把字符串类型的字典转换为纯字典
    pic = []
    for k, v in r1.items():
        if k == 'data':

            for v1 in v:

                for kk, vv in v1.items():
                    if kk == 'thumbURL':
                        pic.append(vv)
    return pic   #pic也就是图片的url,是一个列表类型

该写的注释都放在代码里面了,这里就不多说了,大家感兴趣的可以通过pycharm的单步调试看看我的代码的变量的变化,说得多还不如大家自己实战一下。嘿嘿。


第四部分:
找出图片的url之后当然就可以下载了。这才是正活。所以我把下载的代码放在我的主函数里面了。
上一波代码:

代码四:

if __name__ == '__main__':
    print("请输入要下载的图片类型(比如胡歌): ", end=" ")
    skt = input()
    print("请输入要下载的页数(整数,每页30张图片): ", end=" ")
    page = int(input())
    for j in range(0, page):
        pic = aaa(j * 30, skt)
        for i in range(len(pic)):
            r = requests.get(pic[i], headers=headers, timeout=5000)
            path1 = "D:\\图片下载"
            if not os.path.exists(path1):
                os.makedirs(path1)
            path = path1 + '\\' + skt
            if not os.path.exists(path):
                os.makedirs(path)
            if not os.path.exists(path + '\\' + str(j * 30 + i + 1)):
                with open(path + "\\" + str(j * 30 + i + 1) + '.jpg', 'wb')as f:
                    f.write(r.content)
                f.close()
                print("done " + time.ctime())
            else:
                pass


写道这里,整个爬取过程就完了。
总结一下爬虫爬取网上资源的基本思路:
第一步:导入必要的库
第二步:requests库大法
第三步(最重要的一步):找出你需要资源的url。
如果你需要爬图片,就需要找图片的url
如果你需要爬文字,就需要找文字的位置8
如果你需要爬视频,就找视频的url
等等等等,以此类推。


顺便提一下:爬虫的知识和其他的知识也有一个交互,比如一些前端的知识(至少你得知道怎么网页标签是怎么回事),你还得会用Chrome的检查元素(F12)的功能吧还有一些定位资源的库如beautifulsoup和xpath等
关于beautifulsoup,这里有一篇文章讲得很好
爬虫beautifulsoup
还有xpath呢,这里也有一篇文章
爬虫的xpath

写在后面的话
笔者是一名计算机专业的学生,目前在学习nlp的知识,由于NLP开始就要爬取数据,所以一开始就得学习爬取数据,顺便也把Python学得熟练一点。
大家看完之后如果有不明白的可以关注我的微信公众号:计算机前沿技术,我的所有文章都会同步到我的公众号,欢迎大家关注收藏。
另外,大家看完之后如果有不明白的地方,欢迎大家在评论后提出,或者有思路更好的地方。也欢迎大家和我交流。


最后:我的第一篇博客,竟然写了9000多字,自己都震惊了,啊哈哈哈哈哈。
如果可以的话,看完后请笔者喝杯奶茶吧。哈哈。
欢迎转载,务必注明出处。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页