欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python爬虫实践-爬取京东商品图片

程序员文章站 2022-07-14 11:10:25
...

这段时间,因为疫情在家无聊,想起了网络爬虫,之前有写过使用requests库,又学了下使用urllib库,在这里记录下学习过程。
首先使用的IDE是pycharm,解释器版本3.
第一步:分析某东的url,发现某东搜索的url构成规律,输入汉服后开始搜索。
python爬虫实践-爬取京东商品图片
点击下一页后,保存相对应的url
python爬虫实践-爬取京东商品图片
发现每一页的url不同之处在于其中的&page=数字那里,从第二页开始,page= 后面的数字以2递增,为一个等差数列。改写page=0,在浏览器中打开后发现是第一页,所以所有的url可以构造为一个列表。
python爬虫实践-爬取京东商品图片
第二部,分析html,查找每一个商品图片对应的url
python爬虫实践-爬取京东商品图片
检查两三个图片的html元素
发现图片url是这样子的,方便好设计正则表达式,因为html中有很多url不是商品图片链接,所以有必要多看几个,当然,大佬就肯定不必了(我是新手哈哈哈))
python爬虫实践-爬取京东商品图片
正则表达式:

pat = re.compile(r'//.{5}\.360buyimg.com/n8/.*\.jpg') 

然后就是一次次打开图片url后保存了

附代码:

#-*- coding:utf-8 -*-
"""
@Date: 2020/2/11 20:38
@Author:Shihan Wong
@File: 某东商品图片爬取.py
@Software: PyCharm
"""

import urllib.request
import UA_Pool                              # 自定义的用户代理池
import requests , re
import IP_Pools                             # 自定义的IP池
import os


this_ua = UA_Pool.get_UA()
headers = ("user-agent" , this_ua)

kw = urllib.request.quote('汉服')      # 关键字

page_num = int(input("请输入要爬取的页数:"))           #获取爬取页数

urls = ["https://search.jd.com/Search?keyword=%E6%B1%89%E6%9C%8D&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%B1%89%E6%9C%8D&page= "
       + str(2 * i -1)  + "&s=213&click=0" for i in range(1 , page_num + 1)]          # 构造页面url列表

"""
this_ip = IP_Pools.get_ip()
pro = urllib.request.ProxyHandler({"http":this_ip})
opener = urllib.request.build_opener(pro , urllib.request.HTTPHandler)
opener.addheaders = [headers]
urllib.request.install_opener(opener)
# res = urllib.request.urlopen(url).read().decode("UTF-8" , "ignore")
"""

this_agent = UA_Pool.get_UA()      # 调用get_UA函数获取UA
header = {
    "user-agent":this_agent
          }              # 构造报头


flag = 1       # 页数标识,从第一页开始
for url in urls:          #遍历页面url列表
    path = "E:\\Desktop\\" + str(flag) + "页"
    if os.path.exists(path) == False:
        os.mkdir(path)

    try:
        res = requests.get(url, headers=header)    # requests.get请求
        res.encoding = res.apparent_encoding       # 转换编码
        html = res.text                            # 返回html文件

        pat = re.compile(r'//.{5}\.360buyimg.com/n8/.*\.jpg')       #定义正则表达式
        links = pat.findall(html)                                     # 匹配图片的url链接



        for link in links:                         #遍历字ulr列表
            url_sub = 'http:' + link               # 构造url链接,需要在前面添加http:
            res_sub = requests.get(url_sub)        # 再次请求

            post_name = link.split("/")[-1]       # 以/分割每一个url,用最后一个定义为该url所对应的图片文件名称

            save_path = path + "\\" + post_name      # 再次设计保存路径

            with open(save_path, 'wb') as f:  # 将图片爬取保存,以二进制方式
                f.write(res_sub.content)

        flag += 1       # 保存后页数标识加一

    except Exception as e:
        print(e)                                # 提示错误

代码中flag的作用就是记录一下爬取的页数,然后好方便创建相对应的文件夹
哈哈哈本来是想用urllib的,但莫名其妙出现错误,但requests却可以,显示好像编码啥的有问题。