python简易_Python简易爬虫

Python小爬虫——贴吧图片的爬取

在对Python有了一定的基础学习后,进行贴吧图片抓取小程序的编写。

目标:

首先肯定要实现图片抓取这个基本功能

然后实现对用户所给的链接进行抓取

最后要有一定的交互,程序不能太傻吧

一、页面获取

要让python可以进行对网页的访问,那肯定要用到urllib之类的包。So先来个 import urllib

urllib中有 urllib.urlopen(str) 方法用于打开网页并返回一个对象,调用这个对象的read()方法后能直接获得网页的源代码,内容与浏览器右键查看源码的内容一样。

1 #coding:utf-8

2 import urllib

3

4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195')#打开网页

5 htmlcode = page.read()#读取页面源码

6 print htmlcode#在控制台输出

运行结果与查看源码其实差不多

运行结果就不放上来了

也可以写到文本文档中:

1 #coding:utf-8

2 import urllib

3

4 page = urllib.urlopen('http://tieba.baidu.com/p/1753935195')

5 htmlcode = page.read()

6 #print htmlcode

7

8 pageFile = open('pageCode.txt','w')#以写的方式打开pageCode.txt

9 pageFile.write(htmlcode)#写入

10 pageFile.close()#开了记得关

运行一遍,txt就出现在了getJpg.py

的目录下

好了别闹,我们把它封装成方法:

1 def get_html(url):

2 page = urllib.urlopen(url)

3 html = page.read()

4 return html

然后我们的页面获取代码就K.O.了

二、图片(目标)的提取

做完上面步骤,你打开txt一看,我去!这都是什么跟什么啊,根本找不到图片在哪好伐?

客官别急啊,我这就去给你叫我们的小。。。图片!图片!

首先我们要一个正则表达式 (什么你不会?请看菜鸟入门教程-->

然后我们看源代码,Yeah 我们找到了其中一张图片是这样的

写出图片的正则表达式: reg = r'src="(.+?\.jpg)" width'

解释下吧——匹配以src="开头然后接一个或多个任意字符(非贪婪),以.jpg" width结尾的字符串。比如图中红框内src后 双引号里的链接就是一个匹配的字符串。

接着我们要做的就是从get_html方法返回的辣么长一串字符串中 拿到 满足正则表达式的 字符串。

用到python中的re库中的 re.findall(str) 它返回一个满足匹配的字符串组成的列表

1 # coding:utf-8

2 import urllib

3 import re

4

5 def get_html(url):

6 page = urllib.urlopen(url)

7 html = page.read()

8 return html

9

10 reg = r'src="(.+?\.jpg)" width'#正则表达式

11 reg_img = re.compile(reg)#编译一下,运行更快

12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195'))#进行匹配

13 for img in imglist:

14 print img

打印出这么多图片链接

光把链接拿出来没用啊,我们的目标是下载下来~

urllib库中有一个 urllib.urlretrieve(链接,名字) 方法,它的作用是以第二个参数为名字下载链接中的内容,我们来试用一下

在上面代码循环中加上 urllib.urlretrieve(img, 'tieba.jpg')

卧槽!!!怎么只下了一张

至少它下载了不是?啪啪啪啪啪(掌声)

检查下问题出在哪。。。。

没错我们只给了一个tieba.jpg的名字,后来的把前面的覆盖了。

调整下代码:

1 # coding:utf-8

2 import urllib

3 import re

4

5 def get_html(url):

6 page = urllib.urlopen(url)

7 html = page.read()

8 return html

9

10 reg = r'src="(.+?\.jpg)" width'

11 reg_img = re.compile(reg)

12 imglist = reg_img.findall(get_html('http://tieba.baidu.com/p/1753935195'))

13 x = 0

14 for img in imglist:

15 urllib.urlretrieve(img, '%s.jpg' %x)

16 x += 1

啪啪啪啪啪

第一步完成~

三、指定链接抓取

我想要抓另一个帖子,总不能打开源代码,然后把那段地址改了在运行吧。

只是一个小程序,那也不行欸,加一个让用户指定地址的交互。

先把提取图片的那段代码打包下:

1 def get_image(html_code):

2 reg = r'src="(.+?\.jpg)" width'

3 reg_img = re.compile(reg)

4 img_list = reg_img.findall(html_code)

5 x = 0

6 for img in img_list:

7 urllib.urlretrieve(img, '%s.jpg' % x)

8 x += 1

最后来个请输入:

1 print u'请输入url:',

2 url = raw_input()

3 if url:

4 pass

5 else:

6 url = 'http://tieba.baidu.com/p/1753935195'

7 html_code = get_html(url)

8 get_image(html_code)

运行一下,试试另一个帖子:

完美~~

四、交互的添加

虽然写的是一个简单的小程序,但有强迫症的我还是给他加上了交互(不然多难受啊:双击,屏幕一闪,下载完了。。。)

最后的代码

1 # coding:utf-8

2 import urllib

3 import re

4

5 def get_html(url):

6 page = urllib.urlopen(url)

7 html_code = page.read()

8 return html_code

9

10 def get_image(html_code):

11 reg = r'src="(.+?\.jpg)" width'

12 reg_img = re.compile(reg)

13 img_list = reg_img.findall(html_code)

14 x = 0

15 for img in img_list:

16 urllib.urlretrieve(img, '%s.jpg' % x)

17 x += 1

18

19 print u'-------网页图片抓取-------'

20 print u'请输入url:',

21 url = raw_input()

22 if url:

23 pass

24 else:

25 print u'---没有地址输入正在使用默认地址---'

26 url = 'http://tieba.baidu.com/p/1753935195'

27 print u'----------正在获取网页---------'

28 html_code = get_html(url)

29 print u'----------正在下载图片---------'

30 get_image(html_code)

31 print u'-----------下载成功-----------'

32 raw_input('Press Enter to exit')

相对来说比较舒服的交互体验,大功告成~

参考链接:https://www.cnblogs.com/Axi8/p/5757270.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAT乙类1007之素数对猜想

一、题目 让我们定义d​n为&#xff1a;d​npn1−pn&#xff0c;其中p​i是第i个素数。显然有d11&#xff0c;且对于n>1有d​n是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10​^5)&#xff0c;请计算不超过N的满足猜想的素数对的…

case2

Codeuse dbTempcreate table test(Pid int identity(1,1) not null primary key,Years datetime,IsFirstSixMonths int default(0), --0表示上半年1表示下半年--TotalCome int) insert test select 2007-1-1,0,50union select 2007-3-1,0,60unionselect 2007-12-1,1,80union se…

LeetCode 916. 单词子集(计数)

1. 题目 我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。 现在&#xff0c;如果 b 中的每个字母都出现在 a 中&#xff0c;包括重复出现的字母&#xff0c;那么称单词 b 是单词 a 的子集。 例如&#xff0c;“wrr” 是 “warrior” 的子集&#xff0c;但不是 “wor…

身份证城市代号python_身份证号码的地区代码分别是什么?

展开全部身份证号码的地区代码分别是&#xff1a;1、东北地区&#xff1a; 辽宁省|32313133353236313431303231363533e78988e69d8331333366303835210000&#xff0c;吉林省|220000&#xff0c;黑龙江省|230000&#xff0c;2、华北地区&#xff1a;北京市|110000&#xff0c;天津…

PAT乙类1008之数组元素循环右移问题

一、题目 一个数组A中存有N&#xff08;>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;≥0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A​0A1⋯AN−1变换为&#xff08;A​N−M⋯A​N−1A0A…

LeetCode 987. 二叉树的垂序遍历(递归/循环)

1. 题目 给定二叉树&#xff0c;按垂序遍历返回其结点值。 对位于 (X, Y) 的每个结点而言&#xff0c;其左右子结点分别位于 (X-1, Y-1) 和 (X1, Y-1)。 把一条垂线从 X -infinity 移动到 X infinity &#xff0c;每当该垂线与结点接触时&#xff0c;我们按从上到下的顺序…

Workflow WF Reference Links for 2009-03-20

Workflow Reference Links: 1. Model Portability in BPMN 2.0 Bruce Silver又再一次对BPMN2.0规范中的“可导出交换”能力发表了个人观点。银狐999对这篇文章做了一个博文导读。 2. BPMN Semantics “Vague” or Just Hard to Code? 有关BPMN与BPEL的映射的争论在继续…

PAT乙类1005之继续(3n+1)猜想 (25 分)

一、 题目 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里&#xff0c;情况稍微有些复杂。 当我们验证卡拉兹猜想的时候&#xff0c;为了避免重复计算&#xff0c;可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候&#xff0c;我们需要计算 3、5、8、…

python各种岗位薪资_python编程语言岗位薪资真不是盖的

Python 起薪和均资都高于 Java? C表示&#xff1a;吃瓜看戏!本文爬取了某直聘网站上Python和Java的招聘信息&#xff0c;比较了两个方向的发展前(钱)途 &#xff0c;为本科生的就业方向给一个小小的建议。01、爬取在招聘网站上直接以”本科生”和”Java”或”Python”作为筛选…

LeetCode 456. 132模式(逆序遍历+单调栈)

1. 题目 给定一个整数序列&#xff1a;a1, a2, …, an&#xff0c;一个132模式的子序列 ai, aj, ak 被定义为&#xff1a;当 i < j < k 时&#xff0c;ai < ak < aj。 设计一个算法&#xff0c;当给定有 n 个数字的序列时&#xff0c;验证这个序列中是否含有132模…

一道题目

题目如下&#xff1a;有一500米环形跑道&#xff0c;甲、乙在同一点同向同时起跑&#xff0c;已知甲的速度为60米/分钟&#xff0c;乙的速度为50米/分钟。且甲、乙跑的过程中每跑200米都要停下休息1分钟。问&#xff1a;若甲追上乙一圈需要多少时间&#xff1f;本人比较笨&…

PAT乙类1009 说反话 (20 分)

一、 题目 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字母&#xf…

python 控件叠加_如何将图像应用于控件背景(叠加)

我想为小部件分配一个背景图像&#xff0c;比如QListWidget或QWidget。这个想法是&#xff1a;理想的情况下&#xff0c;背景图像会随着控件大小的变化而调整大小。有什么办法吗&#xff1f;在稍后编辑&#xff1a;下面是这个对话框的屏幕截图&#xff0c;其中包含Salvatore提出…

LeetCode 447. 回旋镖的数量(哈希map+组合数)

1. 题目 给定平面上 n 对不同的点&#xff0c;“回旋镖” 是由点表示的元组 (i, j, k) &#xff0c;其中 i 和 j 之间的距离和 i 和 k 之间的距离相等&#xff08;需要考虑元组的顺序&#xff09;。 找到所有回旋镖的数量。你可以假设 n 最大为 500&#xff0c;所有点的坐标在…

老赵看博客园首页

不知道从什么时候开始&#xff0c;争论一篇文章是不是应该上首页成为博客园的一种流行。无论从任何角度出发&#xff0c;一旦谈起“文章质量”必然会有朋友会牵扯到“首页”&#xff08;见《和谐社区&#xff0c;和谐技术》&#xff09;&#xff0c;然后动辄又抡起一句“你没有…

PAT乙类1010之1010 一元多项式求导

一、题目 设计函数求一元多项式的导数。&#xff08;注&#xff1a;X​n&#xff08;n为整数&#xff09;的一阶导数为nXn−1。&#xff09;输入格式: 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过 1000 的整数&#xff09;。数字间以空格分隔。输出…

此beta版本目前不接受任何新测试员_ASO行业资讯|苹果官方App测试工具TestFlight

ASO行业资讯1数据周报12月8日起&#xff0c;用户在任何 Apple 平台下载 App 之前&#xff0c;App Store 都会先帮助其了解该 App 的隐私保护做法。在每款 App 的产品页面上&#xff0c;用户能了解到该 App 可能收集的某些数据类型&#xff0c;以及该数据是否会关联到他们或对其…

c#执行存储过程的简单实例

/*登陆验证存储过程*/if exists(select name from sysobjects where typep and namecheckUserProc)drop procedure checkUserProcgocreate procedure checkUserProc(checkResult int output,checkUser varchar(50),checkPassword varchar(100))asif exists(select * from userT…

PAT乙类之1011 A+B 和 C

一、题目 给定区间 [−2​^31, 2 ^31​​ ] 内的 3 个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。输入格式&#xff1a; 输入第 1 行给出正整数 T (≤10)&#xff0c;是测试用例的个数。随后给出 T 组测试用例&#xff0c;每组占一行&#xff0c;顺序给出 A、B 和 C。…

LeetCode 492. 构造矩形

1. 题目 作为一位web开发者&#xff0c; 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积&#xff0c;你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求&#xff1a; 你设计的矩形页面必须等于给定的目标面积。 宽度 W 不应…