python实战项目一:requests爬取淘宝图片

按关键词爬取淘宝的图片

●实验过程遇到的问题:

1.      一开始我没注意,将文件名写为requests.py,但是运行时却出现了这个错误:module 'requests' has no attribute 'get',代码检查了好几次,问了下度娘才恍然明白,文件名不能这样用,改了文件名之后运行成功

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)

猜你喜欢

转载自blog.csdn.net/wtwcsdn123/article/details/81031975