爬虫生涯(三):爬取小姐姐的照片③(网站已停用)"/>
从零开始的爬虫生涯(三):爬取小姐姐的照片③(网站已停用)
文章目录
- 前言
- 思路分析
- 1.页面源码分析
- 2.爬虫思路
- 爬虫代码
- 1.开发环境
- 2.代码分解
- (1)爬取每个分项url
- (2)爬取页数
- 3.整体代码
- 爬取结果
前言
从这篇文章开始,我们将通过连续的几篇文章来爬取某妹网(url :/)的所有小姐姐照片。借这个例子我们一起学习简易的python爬虫。
前面的文章请看
从零开始的爬虫生涯(一):爬取小姐姐的照片①
从零开始的爬虫生涯(二):爬取小姐姐的照片②
思路分析
1.页面源码分析
经过前两次的爬取,我们已经取到了自拍分项下的小姐姐照片
但是现在我们的爬虫还有两个问题:
首先,网站不止自拍一个分项,
再其次,上一篇文章我们只取到了前30个页面的url,这对我们爬取全站照片的目标还有一点距离
对于第一个问题,我们只需爬取主页上面各个分项的url就可以解决
只要取到上面的每个a标签的herf就大功告成
对于第二个问题,在翻了几页后我们发现他的翻页(如:)是由page后面的数字来确定的
所以只要我们对这个数字进行修改就可以控制翻页了
问题又来了,每一个分项的总页面不一样,那我们应该怎么控制?
还是通过爬虫去取出页数
只要爬取到label标签,页数那不就有了吗?
然而事实并非如此
爬取label,发现啥也没爬到,而且之后我还尝试了爬label标签的父标签,结果还是啥也爬不出来
查阅资料后,我发现request只会返回html原网页,而目标网站的label标签是通过ajax来动态加载的
好在我又发现一个div块中藏着页数
但是他的页数是储存在属性中的
这可如何是好?
于是我想到了通过正则表达式来取出页数,最后终于成功
2.爬虫思路
对于问题一,直接按照之前文章的思路爬取分项的url
对于问题二,取出div块后先化成字符串,再用正则表达式取出页数
爬虫代码
1.开发环境
开发环境:win10 python3.6.8
使用工具:pycharm
使用第三方库:requests、os、BeatutifulSoup、re
2.代码分解
(1)爬取每个分项url
import requests
from bs4 import BeautifulSoupind = []
target_url = ""
r = requests.get(url=target_url)
html = BeautifulSoup(r.text, 'html5lib')
menu = html.find('ul', class_='menu')
indexs = menu.find_all('a')
#print(indexs)
for index in indexs:temp = index.get('href')ind.append(temp)
del ind[0]
print(ind)
(2)爬取页数
import requests
import re
from bs4 import BeautifulSouptarget_url = "/"
r = requests.get(url=target_url)
html = BeautifulSoup(r.text, 'html5lib')
b2_gap = html.find('div', class_='b2-pagenav post-nav box mg-t b2-radius')#这个div块里有页数
b2_gap = str(b2_gap)#先转换成字符串
regex = '(?<=pages=").[0-9_]*'#re匹配出页书
str_select = re.findall(regex,b2_gap)
print(str_select[0])
3.整体代码
import requests
import os
import re
from bs4 import BeautifulSoupind = []
target_url = ""
r = requests.get(url=target_url)
html = BeautifulSoup(r.text, 'html5lib')
menu = html.find('ul', class_='menu')
indexs = menu.find_all('a')
#print(indexs)
for index in indexs:temp = index.get('href')ind.append(temp)
del ind[0]l = 0
for l in range(len(ind)+1):target_url = ind[l]r = requests.get(url=target_url)html = BeautifulSoup(r.text, 'html5lib')b2_gap = html.find('div', class_='b2-pagenav post-nav box mg-t b2-radius') # 这个div块里有页数b2_gap = str(b2_gap) # 先转换成字符串regex = '(?<=pages=").[0-9_]*' # re匹配出页书str_select = re.findall(regex, b2_gap)v = 0for v in range(int(str_select[0]) + 1):target_url = ind[l] + "//page//" + str(v)r = requests.get(url=target_url)html = BeautifulSoup(r.text, 'html5lib')b2_gap = html.find('ul', class_='b2_gap')print(str(1) + "page is OK")img_main = b2_gap.find_all('a', class_='thumb-link')img_main_urls = []for img in img_main:img_main_url = img.get('href')img_main_urls.append(img_main_url)for j in range(len(img_main_urls) + 1):print(img_main_urls[j])r = requests.get(url=img_main_urls[j])html = BeautifulSoup(r.text, 'html5lib')entry_content = html.find('div', class_='entry-content')img_list = entry_content.find_all('img')img_urls = []num = 0name = html.find('h1').textprint(name)for img in img_list:img_url = img.get('src')result = requests.get(img_url).contentpath = '图片'if not os.path.exists(path):os.mkdir(path)f = open(path + '/' + name + str(num) + '.jpg', 'wb')f.write(result)num += 1print('正在下载{}第{}张图片'.format(name, num))
爬取结果
更多推荐
从零开始的爬虫生涯(三):爬取小姐姐的照片③(网站已停用)
发布评论