实战爬虫:爬取糗事百科用户的头像图片
爬取图片的关键:构建头像的正则表达式
pattern = ‘<img src="//([^s:;]+.(w|/)*(.jpg|.JPEG)??imageView2/1/w/90/h/90)"’
ps:文章来源于小编的头条号:“python数据科学频道”,想在手机端方便看文章的朋友可以去关注我的头条号。
1、实训代码如下:
import re
import urllib.request
def getimg(url,page):
# 设置头文件,模拟成浏览器爬取网页
headers = {
'Connection':'keep-alive',
'Accept-Language':'zh-CN,zh;q=0.9',
'Accept':'text/html,application/xhtml+xml,application/xml;\
q=0.9,image/webp,image/apng,*/*;q=0.8',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}
headall = []
for key,value in headers.items():
items = (key,value)
headall.append(items)
print(headall) # 测试点1:输出头文件
# 设置 opener 对象
opener = urllib.request.build_opener()
opener.addheaders = headall
# 将opener对象设置成全局模式
urllib.request.install_opener(opener)
string = urllib.request.urlopen(url).read()
# 将爬取的网页转换成字符串形式
string = str(string)
print(string) # 测试点2:输出网址的字符串形式
# 构建匹配图片的正则表达式
pattern = '<img src="//([^\s:;]+\.(\w|/)*(.jpg|.JPEG)?\?imageView2/1/w/90/h/90)"'
result = re.compile(pattern).findall(string)
print(result) # 测试点3:输出正则表达式匹配的结果
x = 1
for item in result:
img = item
print(img[0]) # 测试点4:输出真正需要的图片网址
print('检验--','第'+str(page)+'页的第'+str(x)+'图片') # 测试点5:测试前面局部代码是否正确
# 这里的D盘的地址是我保存在我的电脑的本地磁盘地址
filename = urllib.request.urlretrieve('http://'+img[0],\
'D:/python shizhan/myweb/part6-1/'+str(page)+'-'+str(x)+'.jpg')
urllib.request.urlcleanup()
x += 1
print('\n结束--','第'+str(page)+'页结束--') # 测试点6:测试前面局部代码是否正确
# 设置循环遍历爬取13页的用户的头像
for i in range(1,14):
# 爬取的原网页地址
url = 'https://www.qiushibaike.com/8hr/page/'+str(i)+'/'
getimg(url,i)
2、程序运行结果部分截图:
3、应用
这个程序代码的思想可以运用来爬取类似的图片并下载下来。
4、解释代码的原理:
爬取糗事百科的用户头像最重要的两点是:
1.构建匹配头像的正则表达式:
第一个用户图像的链接为:
<img src="//pic.qiushibaike.com/system/avtnew/2680/26800306/thumb/20171229230411.JPEG?imageView2/1/w/90/h/90" alt="山鹰寂寞飞">
第二个用户图像的链接为:
<img src="//pic.qiushibaike.com/system/avtnew/3154/31545611/thumb/20160522144530.jpg?imageView2/1/w/90/h/90" alt="迷你猪猪侠小号">
所以总结出规律得出正则表达式:
pattern = '<img src="//([^s:;]+.(w|/)*(.jpg|.JPEG)??imageView2/1/w/90/h/90)"'
2.糗事百科的网页地址的规律变化:
第一页网址:
第二页网址:
https://www.qiushibaike.com/8hr/page/2/
第三页网址:
https://www.qiushibaike.com/8hr/page/3/
我们把 https://www.qiushibaike.com/8hr/page/1/ 打开发现是第一页的内容,所以由此我们得出糗事百科的网页地址的规律变化: