今日头条图集爬取(第二节)

在上节中,我们已经写下了爬虫流程。
在这节中,我们就来实现这个流程

上节中,我们获取了json文件,这个文件中储存着我们需要的图集id值。而json链接中的offset值代表着不同的页面(虽然看起来都在一页中,它是动态加载的内容)。那么我们首先要构造不同的url,来获取这些json文件。

def get_page_list():
    json_url = 'https://www.toutiao.com/search_content?'
    group_id = []
    for i in range(3):
        full_json_url = json_url + 'offset=' + str(
            i * 20) + '&format=json&keyword=bilibili&autoload=true&count=20&cur_tab=3&from=gallery'
        r = requests.get(full_json_url)
        json_content = json.loads(r.text)
        for i in json_content['data']:
            group_id.append(i['id'])
    return group_id

由于只有offset是不同的,我们只需修改这个值然后把前后相同的连接起来就好,在requests库有构造参数的方法,字符串其实也是一样的,这里就先使用字符串吧。然后我们通过requests库的get方法就获取到了json文件了。
接下来要使用到json库,我忘了json是内置的还是要安装的了。如果是需要安装的话使用pip安装就好。我个人喜欢使用anaconda+pycharm做为python的编写环境,可以减少很多安装库的麻烦。
用json.loads可以加载json文件,并且返回的是字典类型。
至于字典的内容就自己用print打印出来看吧。
然后找到ID值并添加到一个列表中,这样我们就获得了搜索页面的图集id了,而且不止一页。这里我只循环了3次,所以一共是3*20=60个图集的id。
获取ID值后,我们又需要构造图集的url地址,直接在前面加上https://www.toutiao.com/a就好了。

ef get_one_page(group_id, pic_list):
    url = 'https://www.toutiao.com/a'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}
    for i in group_id:
        picture_url = url + str(i)
        r = requests.get(picture_url, headers=headers)

接下来就是获取具体的图片链接了。
我们来到图集的页面。f12点左上角的箭头,再选中图片。


<python3爬虫>今日头条图集爬取(第二节)_第1张图片
image.png

可以看到有很多li标签,还有Img标签,并且在img标签中,可以看到有图片的链接,复制这个链接就可以查看图片了。
然后我们在图集页面右键查看源代码,发现这和我们在f12的element中看到的不一样。正常情况下我们只需用beautifulsoup解析出img的src属性就可以获得链接了。但是这个网页使用JavaScript加载的。并没有li标签和img标签给我们来解析。但是在源代码中仍然保存着图片的地址。


<python3爬虫>今日头条图集爬取(第二节)_第2张图片
image.png

这里的url就是啦。
那么我们要怎么获取这些url呢?
我们可以使用正则表达式。
 pre = re.compile(r'pb9.pstatp.com\\\\/origin\\\\/[\w]+')
        p_list = pre.findall(r.text)
<python3爬虫>今日头条图集爬取(第二节)_第3张图片
image.png

我们成功获取到了图片的链接,这些链接使用requests获得的就是图片了,不需要我们再去解析html了。
接下来保存这些文件就大功告成了(p≧w≦q)

group_id = get_page_list()
pic_list = []
get_one_page(group_id, pic_list)
file_dir = r'D:\toutiao-picture\\'
for index, pic in enumerate(pic_list):
    with open(file_dir + str(index) + '.jpg', 'wb') as f:
        f.write(pic)

爬取结果:


<python3爬虫>今日头条图集爬取(第二节)_第4张图片
image.png

源代码可以查看我的github地址
https://github.com/HOUTASU/crawler_pycharm

你可能感兴趣的:(今日头条图集爬取(第二节))