利用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
通过查看网页源代码,发现所有的图片都在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
从网址中可以发现,每一页都是通过网址最后的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:不知道为什么会重复爬取一遍,我一下子没想明白是咋回事,要是大佬知道,请教教我