额, 明明记得昨晚存了草稿箱, 一觉醒来没了, 那就简写点(其实是具体怎么解释我也不太懂 / 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
以上就是爬取的分析过程, 代码如下
- import requests
- import urllib.parse
- import threading
- #设置最大线程 value
- thread_lock = threading.BoundedSemaphore(value=10)
- #通过 url 获取数据
- def get_page(url):
- page = requests.get(url)
- page = page.content
- #将 bytes 转成字符串
- page = page.decode(utf-8)
- return page
- #label 为关键字
- def pages_from_duitang(label):
- pages = []
- url = https://www.duitang.com/napi/blog/list/by_search/?kw={}&start=0&limit=1000
- #将中文转成 url 编码
- label = urllib.parse.quote(label)
- for index in range(0, 3600, 100):
- u = url.format(label, index)
- print(u)
- page = get_page(u)
- pages.append(page)
- return pages
- #通过切片提取路径
- def findall_in_page(page, startpart, endpart):
- all_strings = []
- end = 0
- while page.find(startpart, end) != -1:
- start = page.find(startpart, end) + len(startpart)
- end = page.find(endpart, start)
- string = page[start:end]
- all_strings.append(string)
- return all_strings
- #返回所有图片的链接
- def pic_urls_from_pages(pages):
- pic_urls = []
- for page in pages:
- urls = findall_in_page(page, path":", ")
- pic_urls.extend(urls)
- return pic_urls
- #下载图片
- def download_pics(url, n):
- r = requests.get(url)
- path = ../pics/ + str(n) + .jpg
- with open(path, wb) as f:
- f.write(r.content)
- #解锁
- thread_lock.release()
- def main(label):
- pages = pages_from_duitang(label)
- pic_urls = pic_urls_from_pages(pages)
- n = 0
- for url in pic_urls:
- n += 1
- print("正在下载第 {} 张图片".format(n))
- #上锁
- thread_lock.acquire()
- t = threading.Thread(target=download_pics, args=(url, n))
- t.start()
- main(校花)
pics 是我们需要新建的文件夹
目录结构如下, d2018.3.2_urlopen.py 是代码, pics 是用来存图片的文件夹
运行结果
校花们就都存入囊中了, 但是数量有点少, 只有 100 个, 好像是只爬取了一页的图片, 代码应该还有点小问题
不同的网站防爬不一样, 但思路应该都差不多
来源: http://www.bubuko.com/infodetail-2513499.html