• python3网络爬虫(2.1):爬取堆糖美女


    额,明明记得昨晚存了草稿箱,一觉醒来没了,那就简写点(其实是具体怎么解释我也不太懂/xk,纯属个人理解,有错误还望指正)

    环境:

      版本:python3

      IDE:pycharm2017.3.3

      浏览器:火狐(浏览器建议火狐,Chrome)

      爬取网站:堆糖

    选堆糖是因为比较好爬取(除了img文件就是xhr文件),别网站的反爬取对我这个水平来说都太心机了

    安装配置什么的之前都写过,这里就不提了,直接开始

    1.先来浏览一下这个网站,打开堆糖官网,搜索校花,他就会给我们推荐一些图片,当我们滚动到页面底部时,他又会加载新的一些图片,再滚到底,再加载,这样加载了五次,才把第一页的所有图片加载出来(这里体现了这个网站的防爬,不过也好破)

    我们的目标就是把这19页,每页的图片都爬下来

    2.重新搜索一下关键字,我们先不往下滚动,右键查看元素,选择网络,可以看到目前这一页中加载的图片,

    3.然后我们把页面往下滚动,让他继续加载,同时我们观察者网络这个窗口,所有请求的图片也都显示在这里,这时发现xhr类型的文件,这样的文件一共有五个,也就是同一页面中每次滚动到页面底部,新加载图片时就会出现这样的文件

    4.主要关注一下这个文件,把窗口切换到xhr类型下,双击打开其中的一个

    5.这个请求网址使我们需要的,复制到地址栏中

    6.这里打开如果是所有代码堆在一起的那样,就需要在线解析一下,解析工具 将地址复制进去进行校验

      而我这里的火狐浏览器打开直接就是转换好的

      其中的path就是我们需要的

    而这个limit就是限制我们爬取数量的参数,后面需要修改这个参数来爬取全部图片

    7.对请求地址进行分析

    https://www.duitang.com/napi/blog/list/by_search/?kw=校花&type=feed&include_fields=top_comments,is_root,source_link,item,buyable,root_id,status,like_count,sender,album&_type=&start=24&_=1520036797589

      将没用的删掉

    https://www.duitang.com/napi/blog/list/by_search/?kw=校花&start=24

      修改参数start(从0开始爬取),添加参数limit(上限),格式都是&开头

    https://www.duitang.com/napi/blog/list/by_search/?kw=校花&start=0&limit=1000

    以上就是爬取的分析过程,代码如下

     

     1 import requests
     2 import threading
     3 import urllib.parse
     4 
     5 #设置最大线程 开启10个线程就锁住
     6 thread_lock = threading.BoundedSemaphore(value=10)
     7 
     8 
     9 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=1000'
    10 #通过url 获取数据
    11 #单个页面
    12 def get_page(url):
    13     #requests.get 自带了json.loads
    14     page = requests.get(url)
    15     #提取需要的content
    16     page = page.content
    17     # 将bytes转成 字符串
    18     page = page.decode('utf-8')
    19     return page
    20 
    21 #label为关键字
    22 #取所有页面pages的链接
    23 def pages_from_duitang(label):
    24     pages = []
    25     url = 'https://www.duitang.com/napi/blog/list/by_search/?kw={}&start={}&limt=1000'
    26     #将中文转成url编码
    27     label = urllib.parse.quote(label)
    28     for index in range(0, 3600, 50):
    29         #将这两个变量替换占位符{}
    30         u = url.format(label,index)
    31         page = get_page(u)
    32         pages.append(page)
    33     return pages
    34 
    35 
    36 # print(get_page('https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%A0%A1%E8%8A%B1&start=0&limt=1000'))
    37 #page是get_page()返回的页面信息
    38 #startpart和endpart是边界条件,两个给定的字符串
    39 # 单个页面的对象,startpart 所要匹配字符1,匹配的字符2
    40 def findall_in_page(page,startpart,endpart):
    41     all_strings = []
    42     end = 0
    43     # 从end这个字符串开始找,找startpart
    44     # .find()!=-1说明找到该字符串,返回的是该字符串的起始下标
    45     while page.find(startpart,end) != -1:
    46         # 需要的图片的链接的起始位置start
    47         start = page.find(startpart, end)+len(startpart)
    48         # 从起始字符串开始找结束字符串
    49         end = page.find(endpart,start)
    50         #切片 取两个所要匹配字符 之间的部分也就是图片url
    51         string = page[start:end]
    52         #存入列表
    53         all_strings.append(string)
    54     return all_strings
    55 
    56 # "path": "https://b-ssl.duitang.com/uploads/item/201708/20/20170820215827_fa483.jpeg"
    57 def pic_urls_from_pages(pages):
    58     pic_urls = []
    59     for page in pages:
    60         # 处理一个页面
    61         urls = findall_in_page(page,'path":"','"')
    62         pic_urls.extend(urls) # 合并列表
    63     return pic_urls
    64 
    65 def download_pics(url, n):
    66     r = requests.get(url)
    67     path = '../pics' + str(n) + '.jpg'
    68     with open(path,'wb') as f:
    69         f.write(r.content)
    70     #下载完了,解锁
    71     thread_lock.release()
    72 
    73 def main(label):
    74      pages = pages_from_duitang(label)
    75      pic_urls = pic_urls_from_pages(pages)
    76 
    77      n = 0
    78      for url in pic_urls:
    79         n += 1
    80         print('正在下载第{}张图片'.format(n))
    81 
    82         #上锁
    83         thread_lock.acquire()
    84         #下载 这个方法丢进线程池
    85         t = threading.Thread(target=download_pics,args=(url,n))
    86         t.start()
    87 
    88 
    89 main('校花')

    运行结果

    不同的网站防爬不一样,但思路应该都差不多

     

  • 相关阅读:
    数组排序去重
    js打印页面添加分页
    使用navicate可视化工具连接mysql数据库错误
    php_smarty模板引擎与.NET_VTemplate模板引擎对比
    JoshChen判断是否微信内置浏览器访问【转载】
    JoshChen毕业设计分享之班级网站-ASP.NET
    JoshChen防止前台恶意修改数据
    JoshChen安卓开发学习,从零开始(2)
    JoshChen安卓开发学习,从零开始(1)
    JoshChen模式笔记之php单例模式
  • 原文地址:https://www.cnblogs.com/MC-Curry/p/8495786.html
Copyright © 2020-2023  润新知