按关键词爬取淘宝的图片
●实验过程遇到的问题:
1. 一开始我没注意,将文件名写为requests.py,但是运行时却出现了这个错误:module 'requests' has no attribute 'get',代码检查了好几次,才想起来,python调用模块会优先从当前路径下搜索该模块,找不到再去环境变量里找,这个如果用requests命名,那问题就是,程序一运行,当前目录下就有一个requests.py,那么它就会引用该模块,自然会报错,修改文件名之后运行成功
2. 之前一直不怎么懂requests库如何将爬取到的图片下载下来,今天自己体验了一下爬取,才明白,直接附代码吧
with open('D:/pictures/'+str(i)+str(n)+'.jpg', 'wb') as f: f.write(pic.content)
需要注意的是,下载图片打开文件方式为’wb’,即以二进制方式写入。图片、音频、视频这些文件本质都是由二进制码组成的,要想抓取这些,就要拿到它们的二进制码。写入文本可用.text,写入图片音频视频要用.content。
使用正则表达式时,re.compile(pat, re.S).findall(html)或是re.findall(pat,re.S, html),如果要提取的内容在多行,由于.*?不能匹配多行,所以增加re.S这句,可以匹配多行
3. 爬淘宝要模拟浏览器访问,否则会被禁止爬取的,方法是可以加一个头信息爬取
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
r = requests.get(url, headers=headers)
4. 如果我没记错的话,好像用urllib库爬取时,若是想要用关键词爬取,而关键词又是含有中文的话,则要增加一步将中文为url可读取的方式这一步骤,requests库就不需要,
5. 关于if __name__ == '__main__',意思是:当.py文件被直接运行时,if__name__ == '__main__'之下的代码块将被运行,若.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
●最后代码可以实现的功能:一开始只是想爬取淘女郎图片的,后来优化时,就想功能多一点也好,就利用关键词去爬取。所以现在可以任意输入一个关键词,都可以爬取了。
附上代码,主要是给自己做一个笔记,担心在本地的话可能会不小心被自己给删掉
import re
import requests
import time
import os
def get_one_html(url): # 获取一个页面的html页面并返回
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
r = requests.get(url, headers=headers)
if r.status_code == 200:
r.encoding = r.apparent_encoding
return r.text
except Exception as er:
print(er)
def get_pic_url(html): # 用正则提取每一页的关键信息返回
pic_urls = re.findall('"pic_url":"(.*?)"', html, re.S)
img_url = [] # 创建空列表,装每一页的所有图片的链接
for one_pic_url in pic_urls:
img_url.append('http:'+one_pic_url)
return img_url # 返回图片的链接的列表
def write_to_file(page, img_urls): # 写入文件(下载)
i = page # 利用页码,防止后面的写入会覆盖之前的
n = 0
for pic_url in img_urls:
pic = requests.get(pic_url)
with open('D:/pictures/'+str(i)+str(n)+'.jpg', 'wb') as f:
f.write(pic.content)
print('---第{}页第{}张图下载成功---'.format(str(i), str(n)))
n += 1
def main(keyword, page_num, url):
html = get_one_html(url) # 调用函数得到该页的hml
img_urls = get_pic_url(html) # 调用函数得到该页的所有图片的链接
write_to_file(page, img_urls) # 调用函数,写入即下载图片
if __name__ == '__main__':
keyword = input('请输入关键词:')
page_num = eval(input('请输入要爬取的页数:'))
try:
os.mkdir('D:/pictures/')
for page in range(0, page_num):
url = 'http://s.taobao.com/search?q='+keyword+'&s='+str(page)
main(keyword, page_num, url)
if page % 2 == 0:
time.sleep(10) # 每爬取2页停留10秒
except Exception as err:
print(err)