Python爬取煎蛋网的妹子图

煎蛋网其中有一个版面,全是好看的小姐姐。本着美女是学习的第一动力的原则,写个程序把小姐姐们都下载下来。

URL:http://jiandan.net/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.net/ooxx'
browser.get(url)                        # 使用浏览器访问
html = browser.page_source                   # 获取html信息
soup = BeautifulSoup(html, 'lxml')    

imgs = soup.select('img')              # 返回值为list
url_link = soup.select('#body #comments .comments .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.net/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.cn/mw600/55ae61d3gy1fsjaiemac0j21kw23vajh.jpg 这种。
使用request.get解析后.content获取图片的二进制

以二进制写入文件。

程序经验证可以正确执行爬取图片,但运行很慢。完整程序已经上传到 Github

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值