首页 > 编程语言 >python爬取图片

python爬取图片

时间:2023-06-06 19:01:00浏览次数:47  
标签:head python request urllib 爬取 headers html import 图片

希望用python爬取京东手机图片,但是pdb调试发现期望用来保存匹配的图片的列表一直是空
怀疑两个原因:

  • 获取到的要匹配关键字的html网页有问题
  • 正则表达式没写对

将获取到的要匹配关键字的html的字符串写入txt,以utf-8解码,看看是否能查到浏览器打开html搜索到的关键字

发现str(urllib.request.urlopen.read())这个字符串和浏览器ctrl u看到的html代码不一样
查了一下发现问题:
参考文章:
https://www.cnblogs.com/yuantup/p/9761534.html

这篇文章还提供了一段爬京东手机图片的代码,跑了一下,能跑通

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/8 15:11
# @Author  : yuantup
# @Site    : 
# @File    : jdshouji_image.py
# @Software: PyCharm

import urllib.request
import re
import os


def open_url(url):
    head={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37'}
    # head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/5'
                        #   '37.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    req = urllib.request.Request(url, headers=head)
    response = urllib.request.urlopen(req)
    # print(response.getcode())
    html = response.read()
    return html

def get_img_addr(html):
    html_str = html.decode('utf-8')
    # print(html_str)
    img_addrs =[]
    pattern1 = '<img width="220" height="220" data-img="1" src="(.+?[.jpg|.png])"'
    pattern2 = '<img width="220" height="220" data-img="1" data-lazy-img="done"  title=.+? src="(.+?[.jpg|.png])"'
    pattern2 = '<img width="220" height="220" data-img="1" data-lazy-img="(.+?[.jpg|.png])"'
    img_addrs1 = re.compile(pattern1).findall(html_str)
    # print(img_addrs)
    img_addrs2 = re.compile(pattern2).findall(html_str)
    # print(len(img_addrs))
    img_addrs.extend(img_addrs1)
    img_addrs.extend(img_addrs2)
    print(img_addrs)
    return img_addrs

def save_img(img_addrs):
    i = 0
    for each in img_addrs:
        i = i+1
        img_name = each.split("/")[-1]
        with open(img_name, 'wb') as f:
            correct_url = 'http:' + each
            img = open_url(correct_url)
            f.write(img)
    return i


def main():
    path = r'F:/Code/Py/myweb'
    a = os.getcwd()
    print(a)
    if os.path.exists(path):
        os.chdir(path)
        print(os.getcwd())
    else:
        os.mkdir(path)
    # os.chdir(path)

    for i in range(1, 11):
        url = 'https://list.jd.com/list.html?cat=9987,653,655&page=' + str(i)
        html = open_url(url)
        img_addrs = get_img_addr(html)
        print(url)
        save_img(img_addrs)


if __name__ == '__main__':
    main()

观察了一下这段代码是怎么解决html不一致的问题的

主要是上面这一段

所以我尝试用urllib.request.Request(url, headers=head)解决问题,但是首先我需要知道headers

下面这篇博文教给如何看headers:
https://blog.csdn.net/ysblogs/article/details/88530124

我查看了自己的headers,再修改代码:

这次能在txt搜索到我在html上搜索到的关键字了

但是发现正则表达式有问题
第一个过滤条件是许多行组成的,因此(?s)能匹配多行

第二个过滤条件也尝试修改,期间,可以尝试把正则表达式匹配的图片路径print()出来,然后直接用搜索引擎搜索图片,看正则表达式匹配的结果路径是否是正确的图片路径

解决了这两个问题以后,能够成功爬取图片了,完整代码如下:

import pdb
import re
import urllib.request

def craw(url,page):
    head={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.37'}
    
    req = urllib.request.Request(url, headers=head)
    response = urllib.request.urlopen(req)
    html1=response.read().decode('utf-8')
    html1=str(html1)
    with open(r"C:\Users\HUAWEI\Desktop\a.txt","w",encoding='utf-8') as f:
        f.write(html1)
        f.close()

    pat1='(?s)<div id="J_goodsList"(.*)<div class="page clearfix">'
    result1=[]
    temp1=re.compile(pat1).findall(html1)
    result1.extend(temp1)
    result1=result1[0]
    pat2='<img width="220" height="220" data-img="1" data-lazy-img="//(.+?.jpg)"'
    imagelist=re.compile(pat2).findall(result1)
    print(imagelist)
    x=1
    for imageurl in imagelist:
        imagename="F:/Code/Py/myweb/phone"+str(page)+str(x)+".jpg"
        imageurl="http://"+imageurl
        try:
            urllib.request.urlretrieve(imageurl,filename=imagename)
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                x+=1
            if hasattr(e,"reason"):
                x+=1
        x+=1

for i in range(1,10):
    url="https://list.jd.com/list.html?cat=9987%2C653%2C655&page="+str(i)
    craw(url,i)

参考文章:
https://www.cnblogs.com/yuantup/p/9761534.html
https://blog.csdn.net/ysblogs/article/details/88530124
https://blog.csdn.net/rj2017211811/article/details/89742073

标签:head,python,request,urllib,爬取,headers,html,import,图片
From: https://www.cnblogs.com/186xxxxxxxx/p/17461455.html

相关文章

  • Python机器学习——识别不同鸟类
    (一)选题背景:鸟类是野生动物的重要组成部分,是自然界的一项重要资源动物,也是生态系统中的重要组成部分。鸟类是可更新的自然资源,它在商业、旅游、美学、文化、科学和生态上都有重要价值。国内近年来鸟类系统发育与分类、分布的研究不断取得新的成果,这些对于研究我国的鸟类分类区......
  • Python 练手小项目-名片管理
    需求描述需要写一段程序实现简单名片管理功能程序启动展示主界面新建名片显示全部查询名片退出系统主程序实现'''名片管理系统主程序'''importcards_toolswhileTrue:'''显示主界面'''cards_tools.show_menu()action=input('请选择操作功能:�......
  • python打包后,执行报错:NameError: name ‘exit‘ is not defined
    try:file_name=os.path.basename(src)file_size=os.stat(src).st_sizeexceptException:print("源文件不存在:",src)exit()在ide使用中没有问题,但是封装成应用程序时就出现问题: NameError:name'exit'isnotdef......
  • FFmpeg组合图片声音为视频课程
    需求:有了PPT,有了课程的录音,想直接生成PPT画面+同步声音讲解,这样就可以搞成视频课程了。要做的步骤:把PPT另存为图片,比如60页PPT,就是60个JPG;听声音,然后记录画面出现的声音文件的时间位置。 比如:p1.jpg   出现时间点0:0:0  ; p2.jpg  0:0:35 ,做成个excel列表;......
  • Python 中 yeild 的用法
    本文包含以下四部分:yeild介绍yeild案例简单的例子对比yeild和常规函数复杂的例子说明yeild与普通函数的差异1.yeild介绍yield是Python的一个关键字,用于从一个函数中返回一个生成器(generator)。生成器是一种特殊类型的迭代器,它允许你延迟计算结果,这在处理大数据或......
  • CentOS 6.9 python3.10 numpy 安装使用 - gcc 升级
    踩坑记录程序写好了,使用了pandas,放在服务器上,运行报错:Originalerrorwas:/lib64/libgcc_s.so.1:version`GCC_4.8.0'notfound(requiredby/usr/local/lib/python3.10/site-packages/numpy/core/../../numpy.libs/libgfortran-040039e1.so.5.0.0)可以看到是导入numpy......
  • 图片查看器(预览)
    效果实现思路有一个父容器,里面两个子容器,两个子容器分别为图片列表容器和点击之后预览的容器;预览的容器需要一个遮罩层一个图片标签;点击某张图片时遮罩层才出来遮罩层左右会有切换的按钮(但是注意边界条件,第一张没有左箭头,最后一张没有右箭头);切换时就把当前图片的路径换成目......
  • 昇腾实战丨DVPP媒体数据处理图片解码问题案例
    摘要:本期就分享几个关于DVPP图片解码问题的典型案例,并给出原因分析及解决方法。本文分享自华为云社区《DVPP媒体数据处理图片解码问题案例》,作者:昇腾CANN。DVPP(DigitalVisionPre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加......
  • Python Django Xadmin 的使用
    笔者Python版本为3.10.6,Django版本为4.2.2本项目代码已开源,可到GitHub仓库中查看本项目用到的xadmin、DjangoUeditor文件夹笔者已经按照Python3.10版本进行了修改,点击链接即可下载。但如果你使用的Python版本较低,可能会因此出现一些BUG,请到问题汇总查看,如果......
  • 昇腾实战丨DVPP媒体数据处理图片解码问题案例
    摘要:本期就分享几个关于DVPP图片解码问题的典型案例,并给出原因分析及解决方法。本文分享自华为云社区《DVPP媒体数据处理图片解码问题案例》,作者:昇腾CANN。DVPP(DigitalVisionPre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理......