前言

我自己是个python小白,工作也不是软件行业,但是日常没事时喜欢捣鼓一些小玩意,自身有点C语言基础。

听说python很火,可以做出爬虫去爬一些数据图片视频之类的东东,我的兴趣一下子就来了。然后,开始了不归路,各种百度,各种实验。。。

最终的代码环境是安装了python 3.7,安装了PyCharm代码工具,别问我为啥选PyCharm,我也不知道,用着非常顺手不是吗。

当我开始写代码时,找了好多帖子去借鉴尝试,发现python2.0和3.0语法,所用模块等不一样,所以先说好,这个随笔的python版本是3.7的,不属于2.0版本。

这次爬虫的网站是百度贴吧,壁纸吧里的图片,可以打开下面的网址,然后随意选个帖子。

https://tieba.baidu.com/f?ie=utf-8&kw=%E5%A3%81%E7%BA%B8&fr=search

先说下写爬虫的步骤:1.发送网页请求 2.获取响应内容 3.解析网页内容 4.保存数据

第一步是发送请求和响应内容这两个最基本的操作:

要用到urllib.request这个模块,直接开头import就好,python自带的,上代码:

 #! /usr/bin/env python
# -*- coding: utf-8 -*-
import re,os,urllib.request,datetime #url='https://tieba.baidu.com/p/6091256278'
def open_url(url):
req=urllib.request.Request(url)
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64)AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
response=urllib.request.urlopen(req).read()
return response
#print(open_url(url))

请忽略import的其他模块,下面再讲。这个请求非常标准了,模拟用户的请求,所有的爬虫都适用。add.header函数模拟了用户,防止服务器拒绝请求。

复制这段,去掉第5,第12行的#号,可以运行处结果。结果如下:

恩,没错就是这一堆乱码“源代码”。这是跟你在浏览器右键然后查看源代码的结果是一样的,只是这个更原始,没有转码,转码后会有汉字,稍微认识几个,但是也看不懂。

第二步说解析内容,这个比较重要,又非常复杂难懂的操作,上代码:

这里用到了re,os模块,之前import过的,文件操作模块,有兴趣百度多了解下,我也只是用能用到的几个函数。

 def find_img(url):
html=open_url(url).decode('utf-8')
p=r'<img class="BDE_Image" src="([^"]+\.jpg)"'
img_addrs=re.findall(p,html) for each in img_addrs:
print(each)
for each in img_addrs:
file=each.split("/")[-1]
with open(file,"wb") as f:
img=open_url(each)
f.write(img)

第2行是源代码utf-8解码,结果是会有汉字,没有符号乱码了。

第3行是正则表达式,这是复杂的关键点,这个正则也是网络里找到的,用来匹配图片的地址,不多说,也说不出来,百度一下会教你如何放弃学习它,除非你是大神。

接着finall函数,在html的源代码里找符合正则表达式图片的网络地址,然后就是遍历下载下来。

最后一步使用with..open..as模式下载图片,放到文件夹里。

这里用到了datetime模块,用来获得系统的时间,然后我稍作处理一下,来以时间命名文件夹的名字,

 def get_img():
t1 = str(datetime.datetime.now())
t = t1.replace(":", "-").replace(" ", "-")[0:19]
p = "D:\TieBaPic-" + t
os.mkdir(p)
os.chdir(p)
find_img(url)

单独运行第2,3,4行,得到结果是:在D盘生成一个名字如下的文件夹,里面就是上一步下载的图片,名字会根据时间来定,不会重复。

D:\TieBaPic-2019-04-11-16-50-33

第5,6行用到了os模块的两个函数,用来组合建立文件夹。

最后加上启动语句,就可以尝试爬虫了。

 if __name__ =="__main__":
url='https://tieba.baidu.com/p/6091256278'
get_img()

这个双下划线的name函数,是一个变量,用来执行本程序的main,区别于import的模块,只有主程序是main,其他的都是导入的名字,并且

main是调用其他模块的关系,理解就行,没那么多讲究。

把所有的代码串起来就是完整的代码,运行结果如下:

有些图片不太适合我们好学的氛围就P掉了。

以上就是我第一次的爬虫全过程,成功的爬出了图片,心里还是美滋滋的。

现在正在着手给python加个界面运行,等好了,发个随笔记录一下。

Python3.0版本 从听说python可以做爬虫到自己第一成功做出爬虫的经历的更多相关文章

  1. Python3.0 调用HTMLTestRunner生成的报告中不能显示用例中print函数的输出

    官方原生的HTMLTestRunner.py支持python2.0版本,python3.0版本的使用需要做一些修改: Python3调用HTMLTestRunner执行用例生成测试报告中,不能正常显示 ...

  2. Python3笔记001 - 1.1 python概述

    第1章 认识python python语言特点 跨平台 开源的 解释型 面向对象 python语言的特点是:以对象为核心组织代码,支持多种编程范式,采用动态类型,自动进行内存回收,并能调用C语言库进行 ...

  3. HTMLTestRunner修改Python3的版本

    在拜读虫师大神的Selenium2+Python2.7时,发现生成HTMLTestRunner的测试报告使用的HTMLTestRunner的模块是用的Python2的语法.而我本人比较习惯与Pytho ...

  4. Python的简介以及安装和第一个程序以及用法

    Python的简介: 1.Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Pytho ...

  5. 【和我一起学Python吧】Python3.0与2.X版本的区别

    做为一个前端开发的码农,却正在阅读最新版的<A byte of Python>.发现Python3.0在某些地方还是有些改变的.准备慢慢的体会,与老版本的<A byte of Pyt ...

  6. python改成了python3的版本,那么这时候yum就出问题了

    既然把默认python改成了python3的版本,那么这时候yum就出问题了,因为yum貌似不支持python3,开发了这个命令的老哥也不打算继续写支持python3的版本了,所以,如果和python ...

  7. Element-ui 2.8.0版本中提升表格性能,做了哪些事情,原理是什么

    背景 项目中一直用element-ui,之前用el-table的时候,发现表格数据较多时,滑动表格就会很卡.我们的表格中只有200行数据,每行大概有30的字段,表格滑动就卡的不行.在Element-u ...

  8. 你都用python来做什么?

    首页发现话题   提问     你都用 Python 来做什么? 关注问题写回答     编程语言 Python 编程 Python 入门 Python 开发 你都用 Python 来做什么? 发现很 ...

  9. python3.0笔记

    python文件头 #!/usr/bin/env python # -*- coding: utf- -*- ''' Created on 2017年5月9日 @author: Administrat ...

随机推荐

  1. Java 前台后台数据传递、中文乱码解决方法

    1.向前台传递数据;2.向后台传递数据;3.ajax post 提交数据到服务端时中文乱码解决方法;4.数组类型参数传递; 1.向前台传递数据:1.1 字符串数据传递:  这种方式只是单一的向前台传递 ...

  2. [原创]升级SOUI WKE以支持_blank

    由于WKE的精简模式,导致原有的SOUI不支持针对诸多内容的调用,此处针对WKE的部分内容做升级,以支持对应的功能. 目的:使WKE可以_blank弹出新窗口. 由国人 海绵宝宝维护的WKE新分支:h ...

  3. Ceph介绍

    1. 介绍 云硬盘是IaaS云平台的重要组成部分,云硬盘给虚拟机提供了持久的块存储设备.目前的AWS 的EBS(Elastic Block store)给Amazon的EC2实例提供了高可用高可靠的块 ...

  4. HDU 3363 Ice-sugar Gourd (贪心)

    题意:给你一个串,串中有H跟T两种字符,然后切任意刀,使得能把H跟T各自分为原来的一半. 析:由于只有两个字母,那么只要可以分成两份,那么一定有一段是连续的. 代码如下: #include <c ...

  5. Ubuntu下安装配置java及环境变量

    这里的办法不是在线安装,因为需要更新源(你懂的,费时费事~),so这里介绍在Ubuntu上手动下载安装配置Java环境变量 *系统:Ubuntu 16.4 1.下载jdk,直接用系统的Firefox浏 ...

  6. Linux文件排序工具 sort 命令详解

    sort是排序工具,它完美贯彻了Unix哲学:"只做一件事,并做到完美".它的排序功能极强.极完整,只要文件中的数据足够规则,它几乎可以排出所有想要的排序结果,是一个非常优质的工具 ...

  7. 【小梅哥SOPC学习笔记】sof与NIOS II的elf固件合并jic得到文件

    sof与NIOS II的elf固件合并jic得到文件 注意,本方法已经有更加简便的方法,小梅哥提供相应的脚本文件,可以一键生成所需文件,脚本请前往芯航线FPGA技术支持群获取. 7.1 为什么需要将S ...

  8. [LeetCode 题解]: Valid Parentheses

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  9. [LeetCode 题解]: palindromes

    Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negativ ...

  10. 单例模式(Singleton)小记

    概念 引用维基百科对单例的说明: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 继续引用维基百科的实现思路: 实现单例模式的思路是:一个类 ...