零基础教你写python爬虫

简介: 大家都知道python经常被用来做爬虫,用来在互联网上抓取我们需要的信息。使用Python做爬虫,需要用到一些包:requestsurllibBeautifulSoup等等,关于python工具的说明,请看这里:Python 爬虫的工具列表今天介绍一个简单的爬虫,网络聊天流行斗图,偶然发现一个网站www.doutula.com.上面的图片挺搞笑的,可以摘下来使用。

大家都知道python经常被用来做爬虫,用来在互联网上抓取我们需要的信息。

使用Python做爬虫,需要用到一些包:

requests

urllib

BeautifulSoup

等等,关于python工具的说明,请看这里:Python 爬虫的工具列表
今天介绍一个简单的爬虫,网络聊天流行斗图,偶然发现一个网站www.doutula.com.上面的图片挺搞笑的,可以摘下来使用。

我们来抓一下“最新斗图表情”:

 

 看到下面有分页,分析下他的分页url格式:

不难发现分页的url是:https://www.doutula.com/photo/list/?page=x

一步步来:

先简单抓取第一页上的图片试试:

将抓取的图片重新命名,存储在项目根目录的images目录下:

分析网页上img格式:

 

 好了,我们开始准备写程序吧:使用pycharm IDE创建项目

我们抓包会用到:requests 和urllib,需要先安装这些包:file->default settings

 

 点击右侧绿色的+号:

同样的引入:BeautifulSoup,lxml

接下来就可以引入这些包,然后开始开发了:

import requests
from bs4 import BeautifulSoup
import urllib
import os

url = 'https://www.doutula.com/photo/list/?page=1'
response = requests.get(url)
soup = BeautifulSoup(response.content,'lxml')
img_list = soup.find_all('img',attrs={'class':'img-responsive lazy image_dta'})
i=0
for img in img_list:
    print (img['data-original'])
    src = img['data-original']
    #src = '//ws1.sinaimg.cn/bmiddle/9150e4e5ly1fjlv8kgzr0g20ae08j74p.gif'
    if not src.startswith('http'):
        src= 'http:'+src
    filename = src.split('/').pop()
    fileextra = filename.split('.').pop()
    filestring = i+'.'+fileextra
    path = os.path.join('images',filestring)
    # 下载图片
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
    }
    #urllib.request.urlretrieve(url,path,header)
    req = urllib.request.Request(url=src, headers=headers)
    cont = urllib.request.urlopen(req).read()
    root = r""+path+""
    f=open(root,'wb')
    f.write(cont)
    f.close
    i += 1
View Code

注意:

  1.请求的时候需要加上header,伪装成浏览器请求,网站大多不允许抓取。

 

抓完一页的图片,我们试着抓取多页的图片:这里试下抓取第一页和第二页的图片

import requests
from bs4 import BeautifulSoup
import urllib
import os
import datetime
#begin
print (datetime.datetime.now())
URL_LIST = []
base_url = 'https://www.doutula.com/photo/list/?page='
for x in range(1,3):
    url = base_url+str(x)
    URL_LIST.append(url)
i = 0
for page_url in URL_LIST:
        response = requests.get(page_url)
        soup = BeautifulSoup(response.content,'lxml')
        img_list = soup.find_all('img',attrs={'class':'img-responsive lazy image_dta'})
        for img in img_list: #一页上的图片
            print (img['data-original'])
            src = img['data-original']
            if not src.startswith('http'):
                src= 'http:'+src
            filename = src.split('/').pop()
            fileextra = filename.split('.').pop()
            filestring = str(i)+'.'+fileextra
            path = os.path.join('images',filestring)
            # 下载图片
            headers = {
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                'Accept-Encoding': 'gzip, deflate, sdch',
                'Accept-Language': 'zh-CN,zh;q=0.8',
                'Connection': 'keep-alive',
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
            }
            #urllib.request.urlretrieve(url,path,header)
            req = urllib.request.Request(url=src, headers=headers)
            cont = urllib.request.urlopen(req).read()
            root = r""+path+""
            f=open(root,'wb')
            f.write(cont)
            f.close
            i += 1
#end
print (datetime.datetime.now())
View Code


这样我们就完成了多页图片的抓取,但是貌似有点慢啊,要是抓所有的,那估计得花一点时间了。
python是支持多线程的,我们可以利用多线程来提高速度:

分析一下这是怎么样的一个任务:我们将网页地址全部存储到一个list中,所有的图片地址也存储在一个list中,然后按顺序来取图片地址,再依次下载

这样类似一个:多线程有序操作的过程,就是“消费者生产者模式”,使用list加锁来实现队列(FIFO先进先出)。

一起回忆一下队列的特点吧:

 

看代码吧:我们下载第一页到第99页的图片

import requests
from bs4 import BeautifulSoup
import urllib
import os
import datetime
import threading
import time

i = 0
FACE_URL_LIST = []
URL_LIST = []
base_url = 'https://www.doutula.com/photo/list/?page='
for x in range(1,100):
    url = base_url+str(x)
    URL_LIST.append(url)
#初始化锁
gLock = threading.Lock()

#生产者,负责从页面中提取表情图片的url
class producer(threading.Thread):
    def run(self):
        while len(URL_LIST)>0:
            #访问时需要加锁
            gLock.acquire()
            cur_url = URL_LIST.pop()
            #使用完后及时释放锁,方便其他线程使用
            gLock.release()
            response = requests.get(cur_url)
            soup = BeautifulSoup(response.content, 'lxml')
            img_list = soup.find_all('img', attrs={'class': 'img-responsive lazy image_dta'})
            gLock.acquire()
            for img in img_list:  # 一页上的图片
                print(img['data-original'])
                src = img['data-original']
                if not src.startswith('http'):
                    src = 'http:' + src
                FACE_URL_LIST.append(src)
            gLock.release()
            time.sleep(0.5)


#消费者,负责从FACE_URL_LIST中取出url,下载图片
class consumer(threading.Thread):
    def run(self):
        global i
        j=0
        print ('%s is running' % threading.current_thread)
        while True:
            #上锁
            gLock.acquire()
            if len(FACE_URL_LIST) == 0:
                #释放锁
                gLock.release()
                j = j + 1
                if (j > 1):
                    break
                continue
            else:
                #从FACE_URL_LIST中取出url,下载图片
                face_url = FACE_URL_LIST.pop()
                gLock.release()
                filename = face_url.split('/').pop()
                fileextra = filename.split('.').pop()
                filestring = str(i) + '.' + fileextra
                path = os.path.join('images', filename)
                #path = os.path.join('images', filestring)
                # 下载图片
                headers = {
                    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                    'Accept-Encoding': 'gzip, deflate, sdch',
                    'Accept-Language': 'zh-CN,zh;q=0.8',
                    'Connection': 'keep-alive',
                    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
                }
                # urllib.request.urlretrieve(url,path,header)
                req = urllib.request.Request(url=face_url, headers=headers)
                cont = urllib.request.urlopen(req).read()
                root = r"" + path + ""
                f = open(root, 'wb')
                f.write(cont)
                f.close
                print(i)
                i += 1



if __name__ == '__main__': #在本文件内运行
    # begin
    print(datetime.datetime.now())
    #2个生产者线程从页面抓取表情链接
    for x in range(2):
        producer().start()

    #5个消费者线程从FACE_URL_LIST中提取下载链接,然后下载
    for x in range(5):
        consumer().start()
    #end
    print (datetime.datetime.now())
View Code

看看images文件夹下多了好多图,以后斗图不用愁了!

 

 OK,到此算是结束了。最后为python宣传一下。

 

目录
相关文章
|
8天前
|
数据采集 XML 数据处理
使用Python实现简单的Web爬虫
本文将介绍如何使用Python编写一个简单的Web爬虫,用于抓取网页内容并进行简单的数据处理。通过学习本文,读者将了解Web爬虫的基本原理和Python爬虫库的使用方法。
|
6天前
|
数据采集 Web App开发 数据可视化
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
|
7天前
|
数据采集 存储 大数据
Python爬虫:数据获取与解析的艺术
本文介绍了Python爬虫在大数据时代的作用,重点讲解了Python爬虫基础、常用库及实战案例。Python因其简洁语法和丰富库支持成为爬虫开发的优选语言。文中提到了requests(发送HTTP请求)、BeautifulSoup(解析HTML)、Scrapy(爬虫框架)、Selenium(处理动态网页)和pandas(数据处理分析)等关键库。实战案例展示了如何爬取电商网站的商品信息,包括确定目标、发送请求、解析内容、存储数据、遍历多页及数据处理。最后,文章强调了遵守网站规则和尊重隐私的重要性。
18 2
|
11天前
|
数据采集 定位技术 Python
Python爬虫IP代理技巧,让你不再为IP封禁烦恼了! 
本文介绍了Python爬虫应对IP封禁的策略,包括使用代理IP隐藏真实IP、选择稳定且数量充足的代理IP服务商、建立代理IP池增加爬虫效率、设置合理抓取频率以及运用验证码识别技术。这些方法能提升爬虫的稳定性和效率,降低被封禁风险。
|
13天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
16 0
|
16天前
|
数据采集 Web App开发 开发者
探秘Python爬虫技术:王者荣耀英雄图片爬取
探秘Python爬虫技术:王者荣耀英雄图片爬取
|
16天前
|
存储 数据采集 NoSQL
使用Python打造爬虫程序之数据存储与持久化:从网络到硬盘的无缝对接
【4月更文挑战第19天】本文探讨了爬虫中的数据存储与持久化技术,包括文本文件存储、数据库(关系型与非关系型)、NoSQL数据库和键值存储,以及ORM框架的使用。根据数据类型、规模和访问需求选择合适存储方式,并注意数据安全、备份和恢复策略。正确选择和应用这些技术能有效管理和利用爬取数据。
|
16天前
|
数据采集 缓存 算法
使用Python打造爬虫程序之Python中的并发与异步IO:解锁高效数据处理之道
【4月更文挑战第19天】本文探讨了Python中的并发与异步IO,区分了并发(同时处理任务)与并行(同时执行任务)的概念。Python的多线程受限于GIL,适合IO密集型任务,而多进程适用于CPU密集型任务。异步IO通过非阻塞和回调/协程实现高效IO,Python的asyncio库提供了支持。应用场景包括Web开发和网络爬虫等。实践指南包括理解任务类型、使用asyncio、避免阻塞操作、合理设置并发度和优化性能。理解并运用这些技术能提升Python程序的效率和性能。
|
16天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
16天前
|
数据采集 前端开发 JavaScript
使用Python打造爬虫程序之揭开动态加载内容的神秘面纱:Python爬虫进阶技巧
【4月更文挑战第19天】本文探讨了如何用Python爬虫抓取动态加载内容。动态加载内容常由JavaScript异步加载,传统爬虫无法捕获。文章介绍了两种方法:1) 使用Selenium模拟浏览器行为,等待动态内容出现并提取数据;2) 分析网页API请求,直接模拟请求获取数据。同时,提醒注意性能、反爬策略和API变动等问题,强调持续学习与实践的重要性。