利用beautifulsoup爬取微博搜素"朋友圈背景图"

微博搜索:朋友圈背景图 1.首先先导入库
requests是用来请求返回网页源代码所需要的请求库,etree和beautifulsoup则是beautifulsoup所需要用到的解析库,os是保存图片所需要用到的库,re是正则表达式用到的库

from lxml import etree
import requests
from bs4 import BeautifulSoup
import os
import re

2.然后写个返回网页源代码的函数get_one_page
函数传递进去的url是我们所要爬取的网页的网址,headers是用来模拟浏览器访问网站,response是是网页返回的信息
当返回的响应状态码等于200时,说明请求成功,就返回网页的源代码

def get_one_page(url): 
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    response=requests.get(url,headers=headers)
    if response.status_code==200:
             return response.text
    return None

3.接着写一个解析页面,提取我们所需要的信息的函数parse_one_page

python爬取微信好友图片 爬取朋友圈图片_python爬取微信好友图片


通过查看网页源代码,发现所有的图片都在class='card-wrap’的class='m3’的li中的img标签里面,card-wrap是每一条微博的盒子的类名,m3是ul的类名

由此,我们只需要把每个m3里的li中的img提取出来就可以获得图片的链接,接下来通过beautifulsoup把每个img标签都给提取出来,然后通过正则表达式把uid(用户的id)和pic_id(图片的id)从img中提取出来,放进yield中返回

def parse_one_page(html):
    soup=BeautifulSoup(html,'lxml')
    items=soup.find_all(class_='card-wrap')
    for item in items:
        nr1=item.find_all(name='ul',class_='m3')
        for nr2 in nr1:
            image=nr2.select('li > img')
            for image2 in image:
                img=image2['src']
                action_data=image2['action-data']
                uid=re.search('uid=(\d+)&',action_data).group(1)
                pic_id=re.search('pic_id=(.*)',action_data).group(1)
                yield{
                    'img':img,
                    'uid':uid,
                    'pic_id':pic_id
                }

4.接着写一个保存图片的函数save_img
root_path是保存文件的目录,然后通过os将图片写入目录的文件夹里

def save_img(item):
    root_path=r'C:\Users\HASEE\微博背景图'
    uid=item['uid']
    pic_id=item['pic_id']
    img=item['img']
    img_name=pic_id+'.jpg'
    img_path=root_path+r'\{0}'.format(img_name)
    if not os.path.exists(root_path):
        os.makedirs(root_path)
    if not os.path.exists(img_path):
        r = requests.get('http:'+img)
        with open(img_path, 'wb') as f:
            f.write(r.content)
            f.close()
            print(uid+'的'+pic_id+"文件保存成功")
    else:
        print("文件已存在")

5.最后写一个主函数main

python爬取微信好友图片 爬取朋友圈图片_正则表达式_02


从网址中可以发现,每一页都是通过网址最后的page改变,所以爬取页数只需要改page的值就可以搞定

首先先写一个循环,循环输入每一页的url,通过调用上面写的get_one_page函数,获得每页的网页源代码并赋值给html,然后通过parse_one_page函数将每一页的图片链接都提取出来,最后调用save_img函数将图片下载下来

def main():
    x=0
    for i in range(10):
        url='https://s.weibo.com/weibo/%25E6%259C%258B%25E5%258F%258B%25E5%259C%2588%25E8%2583%258C%25E6%2599%25AF%25E5%259B%25BE?topnav=1&wvr=6&page='+str(i)
        html=get_one_page(url)
        for item in parse_one_page(html):
            x=x+1
            print('第'+str(x)+'张')
            save_img(item)

6.所有步骤都已经完成,最后通过main()启动主函数就可以爬取朋友圈背景图了

main()

ps:这是我学习完爬虫第一次发帖,对于很多名词性的东西也是经常记混,如果发现啥错误请告诉我,我立马改正
ps:不知道为什么会重复爬取一遍,我一下子没想明白是咋回事,要是大佬知道,请教教我