小白学爬虫——爬取今日头条里的图片(二)

上一节我们爬取的网页是要下载的图片在一个页面全部展示出来。

在今日头条里还有一种网页是一张一张的展示图片,要想看下一张图片必须点一下才能看。

今天我们就把这种网页图片给爬下来。

go......

一、首先我们分析网页

这里我给一个网页地址:https://www.toutiao.com/a6620381685949137415/

按F12进入开发者模式

点一下左上角的小箭头先看两张图片

我们会发现即时我们不打开图片,也能得到所有图片网址,也就是<li>里面的网址。

好了我们开始写代码,把它提取出来

#导入模块
import requests
from bs4 import BeautifulSoup
import re
import time

s = requests.session()#建立连接
headers = {'User-Agent': 'Chrome/63.0.3239.132'}#设置headers让网站认为我们是在用浏览器访问
req = s.get(url, headers=headers, verify=False)#获取网页内容
time.sleep(1)#停一下,免得网速不行,不能得到网页内容
html = req.text
print(html)#把获取的网页内容打印出来

运气不错获取到了内容。

二、把获取到内容用正则表达式提取出来

大家可能会部为什么用正则,因为我现在只会正则(汗...................)

首先我们分析得到的内容,我们会发现这个网页我们根本无法使用BeautifulSoup提取到里面的元素,查资料吧,网上有一大堆的方法,有使用无头浏览器再次渲染,但是这个学习成本真的很大,留在以后慢慢学吧。

还是使用我们的正则,简单粗暴有效,哈哈.............

经过观察获取的见容,我们发现这很像一个字典啊,没错这就是传说中的json数据。

那么怎么提取这个json数据呢?

我用正则,可是.....................

再来认真的学一下正则吧(1小时过去了,)试试了很多表达式不行,看来我还是要再学习啊!

可是领导正催着要呢,再说还要显示出咱的效率不是?

我再看,再看,再看....................有了

没错,所有的图片网址都是以http开头的。你说你怎么知道是这些网址啊?当然是和我们一开始在开发者模式里看到的网址一样才知道的。

我们来试试

r = re.compile(r'http:(.*?)\\"')
lst = r.findall(html)
print(lst)

没错就是它。

接下来就是不断的进行调试,最终得到正确的网址。

最终代码如下:

import requests
import re
import time



def pa_two(url):
    s = requests.session()
    headers = {'User-Agent': 'Chrome/63.0.3239.132'}
    req = s.get(url, headers=headers, verify=False)
    time.sleep(1)
    html = req.text
    print(html)
    r = re.compile(r'http:(.*?)\\"')
    lst = r.findall(html)
    #去掉重复的网址
    for x in range(0, len(lst), 4):
        img_url = re.sub(r'\\', '', lst[x])#去掉网址里重复的'\\'
        img_url = r'http://' + img_url[2:]#去掉网址里开头的'\\'
        res = requests.get(img_url)
        time.sleep(0.5)
        with open(str(time.time()) + '.jpg', 'wb') as f:#保存图片
            f.write(res.content)
            time.sleep(0.1)


if __name__ == '__main__':  # read_text()
    pa_two('https://www.toutiao.com/a6620381685949137415/')

好了。至此这类活动显示的图片也成功的爬取了。

真的很有成就 感!就是太累了!

posted on 2018-11-28 11:13  daxia5398  阅读(501)  评论(0编辑  收藏  举报

导航