前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >发爬虫和反反爬虫(下篇)

发爬虫和反反爬虫(下篇)

作者头像
小小詹同学
发布2018-07-24 17:38:42
6300
发布2018-07-24 17:38:42
举报
文章被收录于专栏:小詹同学小詹同学
上篇从理论上总结讲述了反爬虫的原因、反爬虫的常用手段以及我们针对反爬虫进行的反反爬虫手段!这篇操刀实战爬取一些精彩图片~考虑到上篇纯粹的理论姿势都能被封,这里不做展示,相信大部分小伙伴都看到了上期的成果展示哈~

首先我们都知道要爬取网站图片有简单的几个步骤:获取网页源码、审阅元素寻找所需信息、下载并保存到指定位置。

因为本爬虫系列曾爬取过头条上的妹子图,大部分步骤雷同,这里主要是针对上篇中的反爬与反反爬进行拓展,采取模块化的思路进行程序文档编写。(推荐小甲鱼系列视频,非广告……)

首先,主函数目的就是下载并保存目标图片:

代码语言:javascript
复制
if __name__ == '__main__':
    download_img()
    time.sleep(5)#停止一会,防止频率过快被封IP或账号

主函数中的download_img()函数需要如下代码中的几个步骤。按照模块化的思路,定义get_page函数、find_imgs函数和save_img函数,使得函数框架更加的清晰。

代码语言:javascript
复制
def download_img(folder = 'ooxx',pages = 10):
#包含两个参数:目标文件夹;爬取的页面数量
    os.mkdir(folder)
    os.chdir(folder)
    #创建文件夹到目标路径并改变当前工作目录到指定的路径
    url = 'http://jandan.net/ooxx/' 
    #待爬取网站的url
    page_num = int(get_page(url))
    #根据url获取当前页码,并改为整形赋值给page_num
    for i in range(pages):
        page_num -= i
        page_url = url+ 'page-' + str(page_num) + '#comments'
        #图片所在页面的url
        img_addrs = find_imgs(page_url)
        #根据url找到图片,保存在img_addrs列表中
        save_img(folder, img_addrs)
        #保存列表中的图片到指定目标路径下的文件夹

接下来就该写的是几个自定义函数了,而在get_page函数和save_img函数中都需要读取url,获取信息。所以考虑到代码精简,再定义个子函数url_open()。如下代码所示(注释部分为使用代理IP的时候,&header的伪装和代理IP的使用参考上篇文章)

代码语言:javascript
复制
def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
    # ~ proxies = ['125.120.201.62:808',   
    # ~ '183.159.91.240:18118',  
    # ~ '171.12.182.238:26316',
    # ~ ]
    # ~ proxy = random.choice(proxies)
    # ~ proxy_support = urllib.request.ProxyHandler({'http':proxy})
    # ~ opener = urllib.request.build_opener(proxy_support)
    # ~ urllib.request.install_opener(opener)
    response = urllib.request.urlopen(url)
    html = response.read()
    return html

下边是download函数里需要调用的三个自定义子函数:

代码语言:javascript
复制
def get_page(url):
    # 返回页面
    html = url_open(url).decode('utf-8')
    a = html.find('current-comment-page') + 23
    # 返这里没有用正则表达式,采用find方法查找信息
    # 23和下边的9,4都是偏移量(自己在网页上审阅元素数即可) 
    b = html.find(']',a)
    return html[a:b]def find_imgs(page_url):
    url_open(url).decode('utf-8')
    img_addrs = []
    a = html.find('img src=')
    while a != -1: 
        b = html.find('.jpg',a,a+255) 
        #限制b的范围
        #找不到jpg(因为存在gif的情况)即b返回-1
        if b != -1:
            img_addrs.append(html[a+9:b+4])
        else:
            b = a + 9 
        a = html.find('img src=',b) #起始于b
    for each in img.addrs:
        print(each)
        
def save_img(folder, img_addrs):
    for each in img_addrs:
        filename = each.split('/')[-1]
        #分离出最后一个‘/’后的内容作为名称
        with open(filename,'wb') as f:
            img = url_open(each)
            f.write(img)

往期推荐

Python爬虫系列——入门到精通

Python爬虫实例之——小说下载

老司机带你用python来爬取妹子图

知乎大神爬取高颜值美女(Python爬虫+人脸检测+颜值检测)

千元资料免费送——人工智能相关(100G+)

资源福利第二弹——PPT模板和求职简历

资源福利第三弹——Python等教程(包括部分爬虫入门教程)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档