zoukankan      html  css  js  c++  java
  • python爬虫入门

    最近要用爬虫爬几张图片,花了一天时间从网上找了点代码,了解了一下,以下代码都是从网上下载,侵删。爬虫代码不少,但是涉及到软件版本问题,所以不是都能用,以下代码都是基于py3.6 。

    爬虫入门不难,大致都遵循三个步骤:

    1.扒下来(用网页下载器将网页源码全部下载下来)如requests

    2.存起来(URL管理器将源码存储)可以存内存,也可以整个数据库

    3.找出来(网页解析器找到其中感兴趣的内容,要下载图片就将图片链接找到)如正则表达式 、beautiful soup(推荐这个)等

    代码中真正关键的只有一行

    requests.get(url,params=i)
    用参数params向url以GET方式请求数据,返回值就是需要的源码

    话不多说,直接撸代码

    1.单张图片下载

    # -*- coding: utf-8 -*-
    import requests
    
    # 这是一个图片的url
    url = 'http://yun.itheima.com/Upload/Images/20170614/594106ee6ace5.jpg'
    response = requests.get(url)
    # 获取的文本实际上是图片的二进制文本
    img = response.content
    # 将他拷贝到本地文件 w 写  b 二进制  wb代表写入二进制文本
    with open( './Sinpic.jpg','wb' ) as f:
        f.write(img)

    2.静态网页图片下载

    # //引入小需要用到的模块
    import requests
    import os
    from bs4 import BeautifulSoup
    def main():
      
        url="http://www.duitang.com/search/?kw=%E6%96%87%E8%B1%AA%E9%87%8E%E7%8A%AC&type=feed"
        req = requests.get(url)
      
      # //将网页内容存储到html_doc变量中
        html_doc = req.text
        soup = BeautifulSoup(html_doc, "lxml")#网页数组化
        
        
        if not os.path.exists('./Stapic/'):  # 新建文件夹
            os.mkdir('./Stapic/')
            
        # 正则匹配的方法,不会用,麻烦,推荐用bs
        # listurl = re.findall(r'src=.+.jpg',buf)
        
        # bs4
        t = 1  # 记录图片张数
        for myimg in soup.find_all('a', class_='a'):
            # pic_name = str(t) + '.jpg'
            img_src = myimg.find('img').get('src')
            ir = requests.get(img_src)
            open('./Stapic/%d.jpg' % t, 'wb').write(ir.content)
            print("正在下载第%d张图片"%t)
            t += 1
    
    if __name__ == '__main__':
        main()

    3.动态网站图片下载

    import requests
    import os
    
    def getManyPages(keyword,pages):
        params=[]
        for i in range(30,30*pages+30,30):
            params.append({
                          'tn': 'resultjson_com',
                          'ipn': 'rj',
                          'ct': 201326592,
                          'is': '',
                          'fp': 'result',
                          'queryWord': keyword,
                          'cl': 2,
                          'lm': -1,
                          'ie': 'utf-8',
                          'oe': 'utf-8',
                          'adpicid': '',
                          'st': -1,
                          'z': '',
                          'ic': 0,
                          'word': keyword,
                          's': '',
                          'se': '',
                          'tab': '',
                          'width': '',
                          'height': '',
                          'face': 0,
                          'istype': 2,
                          'qc': '',
                          'nc': 1,
                          'fr': '',
                          'pn': i,
                          'rn': 30,
                          'gsm': '1e',
                          '1488942260214': ''
                      })
        url = 'https://image.baidu.com/search/acjson'
        
        # 下面几句是真正访问网站的
        urls = []
        for i in params:
            urls.append(requests.get(url,params=i).json().get('data'))
        #requests.get(url,params=i)用参数i,向url请求数据,;.json()将请求来的数据由<Response [200]>转化为文本,是一个字典;.get('data')将其中的key word为data的数据项其取出来,加入到数组url中
            
            
           
        return urls
    
    
    def getImg(dataList, localPath):
        
        if not os.path.exists(localPath):  # 新建文件夹
            os.mkdir(localPath)
    
        x = 0
        for list in dataList:
            for i in list:
                if i.get('thumbURL') != None:
                    print('正在下载:%s' % i.get('thumbURL'))
                    
                    ir = requests.get(i.get('thumbURL'))
                    
                    open(localPath + '%d.jpg' % x, 'wb').write(ir.content)
                    x += 1
                else:
                    print('图片链接不存在')
    
    if __name__ == '__main__':
        dataList = getManyPages('宠物猪',1)  # 参数1:关键字,参数2:要下载的页数
        getImg(dataList,'./Dynpic/') # 参数2:指定保存的路径
    params的参数可能比较懵,那个不需要自己写的,如下图所示,在百度图片搜索一个关键字,然后F12,按照1.2.3的操作(找不到2可以刷新一下网页),可以在Header中看到需要的这些参数,按照4.5的操作就可以找到图片链接
    这是基本入门,进阶推荐看一下https://cuiqingcai.com/5052.html讲的很详细。
  • 相关阅读:
    SDN大作业
    第06组 Beta版本演示
    SqlServer 将多行字段合并成单行
    C# MD5加密字符串
    Request.IsAjaxRequest()总是返回false
    Mybatis 语句包含单引号的写法
    idea每次启动maven项目都貌似读不到配置
    idea下springboot项目配置文件application.properties不生效的问题
    Ubuntu 设置时区
    SpringBoot 使用MyBatis
  • 原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/9453729.html
Copyright © 2011-2022 走看看