煎蛋网其中有一个版面,全是好看的小姐姐。本着美女是学习的第一动力的原则,写个程序把小姐姐们都下载下来。
URL:http://jiandan/ooxx
- 程序结构
- 分析目标网页
- 提取目标信息
- 将图片写入文件夹
程序结构
程序主要由一下四个函数构成
def get_html(url)
def download(html)
def write_to_file(url, num, count)
def main()
- get_html :利用webdriver 请求相应的网站
- download :解析网页,调用下一个函数写入图片,并获取下一页的网址和页码
- write_to_file :将图片写入新创建的文件夹内
- main:程序主函数
分析目标网页
首先还是,打开网页后,右键,选择检查,来查看一下网页的html标签,看看网页的结构
可以发现网页的标签是这么排的:
<body style> == $0
<div id="wrapper">
<div id="body">
<div id="content">
<div id="comments">
<div class="comments">
<div class="cp-pagenavi"> #存上一页和下一页的网址
<ol class="commentlist" style="list-style-type:none;">
<span class="text">
<img src="http://......jpg" #存放图片
既然找到了上一页的URL,以及图片存储的地址,那么就好办了。
我们可以到指定的位置来查找下一个页面的地址,而图片的开头都是以img开头的。
通过查看网页的返回信息:
可以看到,返回的是一堆html代码,并没有所需要的图片链接信息。
所以,网站的图片应该是通过js加载的,如果使用常规的requests请求,返回的数据是得不到图片信息的。这就可以利用selenium自动化测试请求库来进行加载。selenium请求库可以模拟一个真是的浏览器访问网站,加载js,返回所需要的数据。当然,这个需要下载对应的chrome驱动。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10) #设置网站等待时间
提取目标信息
在使用selenium加载了网页后,就可以使用BeautifulSoup解析库来解析其中的信息了:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10) #设置网站等待时间
url = 'http://jandan/ooxx'
browser.get(url) # 使用浏览器访问
html = browser.page_source # 获取html信息
soup = BeautifulSoup(html, 'lxml')
imgs = soup.select('img') # 返回值为list
url_link = soup.select('#body #comments ments .cp-pagenavi a')[-1]
由于select() 函数返回的是一个列表,根据观察, url_link 列表的最后一项即为下一页的链接地址。 查看一下所得到的标签,并提取出其中的网址:
print("查找标签url_link :",url_link)
>> 查找标签url_link : <a class="previous-comment-page" href="//jandan.net/ooxx/page-46#comments" title="Older Comments">下一页</a>
print(type(url_link))
>> <class 'bs4.element.Tag'>
href = re.findall('href="(.*?)"', str(url_link))
print("提取其中的网址href:",href)
>> 提取其中的网址href: ['//jandan.net/ooxx/page-46#comments']
next_url = 'https:' + href[0]
>> 完整下一页的网址: https://jandan/ooxx/page-46#comments
至于页码,也可以通过这种方法来提取出来:
next_page = re.findall('\d+', str(url_link))[0]
print("下一页页码:",next_page)
>> 下一页页码: 46
而提取到的图片链接,可以使用for循环提取出来:
for img in imgs:
img_url = re.findall('src="(.*?)"', str(img)) # 图片链接
if img_url[0][-3:] == 'jpg' and img_url[0][:4] == 'http':
print('正在下载:%s 第 %s 张' % (img_url[0], count))
write_to_file(img_url[0], "第{}页".format(current_page) , count)
因为提取到的img标签中,并不都是图片,还有一些gif、png格式的,以及一些后缀为jpg,但并不是完整图片链接的,这些都是不需要的,所以做一个判断,来剔除掉这些。 (.format()用法与 %s 用法类似)
将图片写入文件夹
现在,网页内的图片也能找到了,下一个页面的网址也能正确提取到,下一个页面页码也已经可以得到了,接下来就是要创建分类的文件夹,并将不同页面的图片保存到他们相应的文件夹内了。
def write_to_file(url, num, count):
'''
把抓取到的图片保存到本地文件
:param url: 图片链接
:param num: 页数(根据页数创建文件夹)
:param count: 第几张(图片编号)
:return: None
'''
dirName = u'{}/{}'.format('煎蛋网', num)
if not os.path.exists(dirName):
os.makedirs(dirName)
filename = '%s/%s/%s.jpg' % (os.path.abspath('.'), dirName, count) #绝对路径 / 煎蛋网+页码 / 第几张
print(filename)
pic = requests.get(url).content
with open(filename, 'wb+') as jpg: #以二进制写 自动关闭文件
jpg.write(pic)
首先在程序默认的地址下(pycharm写的默认在程序所在的目录内),检查一下是否存在该命名的文件,没有的话就创建相应的文件夹
而每次下载的时候,要获得下载路径以及下载的图片信息,于是就打印一下filename,它包含了文件的绝对路径 / 煎蛋网第几页 / 第几张图片 信息
最后,以二进制写文件,使用with语句确保结束后会自动关闭文件。
pic = requests.get(url).content
with open(filename, 'wb+') as jpg: #以二进制写 自动关闭文件
jpg.write(pic)
这里输入的参数url就是前面所获得的页面内图片的信息
类似 http://wx2.sinaimg/mw600/55ae61d3gy1fsjaiemac0j21kw23vajh.jpg 这种。
使用request.get解析后.content获取图片的二进制
以二进制写入文件。
程序经验证可以正确执行爬取图片,但运行很慢。完整程序已经上传到 Github上
更多推荐
Python爬取煎蛋网的妹子图
发布评论