zoukankan      html  css  js  c++  java
  • python爬虫-vmgirls-正则表达式

    概述

    本次爬虫任务是爬取图片网站图片,网址是https://www.vmgirls.com/


    分析网页

    第一步,打开需要爬取的页面https://www.vmgirls.com/13344.html

    打开F12,随便选择一张图片查看图片,操作如下

     第二步,寻找所需下载图片的地址,并分析最优的方式

     第三步,得出结论,可以通过获取每张图片的url地址,进行保存图片的动作


    代码操作

    请求网页

    第一步,我们请求网页并打印网页返回的请求

    import requests
    '''请求网页'''
    response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
    print(response.text)

    发现出现403 Forbidden,我们需要寻找原因

    # <html>
    # <head><title>403 Forbidden</title></head>
    # <body>
    # <center><h1>403 Forbidden</h1></center>
    # <hr><center>Her</center>
    # </body>
    # </html>

    我们插入一个代码

    print(response.request.headers)

    发现问题所在,网页返回的信息中表示,我们发送的请求来源于一个爬虫程序,所以我们需要伪装一个header,

    # {'User-Agent': 'python-requests/2.23.0',
    # 'Accept-Encoding': 'gzip, deflate',
    # 'Accept': '*/*',
    # 'Connection': 'keep-alive'}

    怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers

     复制heades到代码中

    import requests
    '''请求网页'''
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
    }
    
    response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
    print(response.text)
    print(response.request.headers)

    能够正常得到网页返回的信息了


     解析网页

    解析网页本次使用正则表达式

    导入re库

    import re
    
    urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
    print(urls)

    得到5个图片的url链接

    ['https://static.vmgirls.com/image/2019/12/2019122210292813-scaled.jpeg',

    'https://static.vmgirls.com/image/2019/12/2019122210294290-scaled.jpeg',

    'https://static.vmgirls.com/image/2019/12/2019122210295639-scaled.jpeg',

    'https://static.vmgirls.com/image/2019/12/2019122210300913-scaled.jpeg',

    'https://static.vmgirls.com/image/2019/12/2019122210301954-scaled.jpeg']


    保存图片

    将所有的图片保存为文件格式

    for url in urls:
        response = requests.get(url, headers=headers)
        # 将url中后面的数字字段截取出来作为图片的文件名
        file_name = url.split('/')[-1]
        # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        with open(file_name,'wb') as f:
        # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
            f.write(response.content)

    此时需要考虑到两个问题

    1.访问频次

    2.文件应该需要保存在但个文件夹中,问不是散乱的存放

    修改代码如下

    import os
    #
    获得文件夹名 dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1] # 判断文件夹是否存在,并创建文件夹 if not os.path.exists(dir_name): os.makedirs(dir_name) # 遍历所有的url,将所有的url单独保存 for url in urls: # 放置访问频次太高,设置访问频率,需要导入time模块 time.sleep(1) response = requests.get(url, headers=headers) # 将url中后面的数字字段截取出来作为图片的文件名 file_name = url.split('/')[-1] # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 # 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹 # with open(file_name,'wb') as f: with open(dir_name+'/'+file_name, 'wb') as f: # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录 f.write(response.content) # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤 # 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1] # 若想创建文件夹,需要导入os库 # 判断文件夹是否存在

    任务完成

    完整代码

    import requests
    import re
    import time
    import os
    
    '''请求网页'''
    
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
    }
    
    response = requests.get('https://www.vmgirls.com/13344.html', headers=headers)#请求网址并得到一个回复
    html = response.text
    
    """
    print(response.text)
    
    # <html>
    # <head><title>403 Forbidden</title></head>
    # <body>
    # <center><h1>403 Forbidden</h1></center>
    # <hr><center>Her</center>
    # </body>
    # </html>
    
    # 发现了403 Forbidden,也就是这个系统设置了反爬虫,所以需要改变
    # 我们查看一下返回的headers,也就是请求的头信息
    
    print(response.request.headers)
    
    # {'User-Agent': 'python-requests/2.23.0',
    # 'Accept-Encoding': 'gzip, deflate',
    # 'Accept': '*/*',
    # 'Connection': 'keep-alive'}
    
    # 发现这是用python端请求,理所当然的被网页拒绝了,所以我们需要一个伪装的headers,伪装成浏览器发送的请求
    # 怎么做,打开浏览器,指定网页,F12查看浏览器发送的headers
    # {user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36}
    
    # 制作伪装的headers
    # headers = {'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
    # 注意headers是一个字典,不是字符串,所以格式为"user-agent":"头部具体信息"
    
    # 将headers放置到网页请求的前面,即response前
    # 同时response里面带上headers
    # 程序运行之后发现可以正常运行
    
    """
    
    '''解析网页'''
    
    # 解析网页本次使用正则表达式
    # 导入re库
    
    
    # 获得文件夹名
    dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>', html)[-1]
    # 判断文件夹是否存在,并创建文件夹
    if not  os.path.exists(dir_name):
        os.makedirs(dir_name)
    
    
    # 获得所有图片的url链接
    urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
    print(urls)
    
    
    
    """保存图片"""
    
    
    # 遍历所有的url,将所有的url单独保存
    for url in urls:
    
        # 放置访问频次太高,设置访问频率,需要导入time模块
        time.sleep(1)
        response = requests.get(url, headers=headers)
        # 将url中后面的数字字段截取出来作为图片的文件名
        file_name = url.split('/')[-1]
    
        # 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
        # 由于加入了文件夹的步骤,所以with open(file_path,wb)as f中file_path需要带上文件夹
        # with open(file_name,'wb') as f:
        with open(dir_name+'/'+file_name, 'wb') as f:
            # 文件写入每一个response返回的内容,最终保存的即为图片,图片地址在该py文件相同目录
            f.write(response.content)
    
    # 由于这种方式文件是一个个单独的存放在目录下面,并没有较好的分类,我们需要加入一个分类的步骤
    # 根据网页中的名称设置文件夹名为dir_name = re.findall('<h1 class="post-title h3">(.*?)</h1>')[-1]
    # 若想创建文件夹,需要导入os库
    # 判断文件夹是否存在

    图片结果

     

  • 相关阅读:
    无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF
    图解TCP/IP→第2章基础知识
    50个查询系列-第二个查询
    50个查询系列-第一个查询
    50个查询系列-建表和插入数据
    027医疗项目-模块二:药品目录的导入导出-导入功能的Action的编写
    026医疗项目-模块二:药品目录的导入导出-导入功能的Service的编写
    025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装
    024医疗项目-模块二:药品目录的导入导出-HSSF导入类的学习
    023医疗项目-模块二:药品目录的导入导出-从数据库中查出数据用XSSF导出excel并存放在虚拟目录最后下载(包括调试)
  • 原文地址:https://www.cnblogs.com/cy344762694/p/12881660.html
Copyright © 2011-2022 走看看