第一个Python爬虫

我的Python情结

大学的时候就想入门编程,作为一个文科生,学校也是一般的工科学校,还有自己没有自我控制能力,入门了一年无果,真的连数据类型都不知道的那种。

毕业之后,在服务业工作,因为工作原因,两天的工作时间算到一天里面,然后第二天休息。这样就有了大把的时间留给自己去折腾。就又想起来学点东西。

在网上看来看去,最后选择了Python,原因嘛,第一就是简单啦,第二容易学,第三漂亮,因为强制缩进,第四就是能玩爬虫(当时见识少)。碰到当时正好网易开了一个计算机系列课程,就跟着学。最后因为一点点基础都没有,学了大概两个月之后放弃了。

最后的结果是误打误撞学了JavaScript。

特别喜欢收集数据,特别喜欢数据的可视化,进行数据比较,占有大量真实的数据去分析一些东西。说白了,就是想用Python去爬一点东西啊。想起来这个就激情澎湃了呢~~。

巨大的计划

现在用找到工作了,工作完成之余,我又拾起来了自己的Python爬虫梦。

给大家说一个特别搞笑的事情,啊哈哈。小白特别容易犯的。就是眼高手低。下面来看看我的计划。

计划的真的特别庞大。想用一个长期运行的服务去跑这个爬虫。

于是:

  • 系统稳定,那就用Ubuntu好了。OK,这个收了,列入学习计划。
  • 功耗要低吧。那现成的就是Raspberry Pi了呗。这个也收了。
  • 爬的东西怎么存放呢,总不能直接扔到外面吧。MySQL呗,这也也收了。
  • 对了,还有Python。

然后啊,然后过两个周之内不断的看Raspberry Pi的相关信息,软硬件的,看Linux的命令,看SQL的语法,还装了Ubuntu和Windows 10的双系统…中间不断自己打脸,就慢慢的冷静了,放弃了。

我还是先用自己的电脑,用Windows写两个能爬图片的爬虫再说吧。

啊哈哈,流产的计划(我去哭一会)。

第一个爬虫的诞生

教程是看的廖雪峰的Python教程,这个教程的最大好处是:写的通顺,不像翻译的文章,那么多英语式汉语;然后就是快。然后就没了。Python 3的教程的print函数居然还没变量的输出,一句话,就是颗粒太大了。真的是入门,懂得了Python里面都有什么名词,都是干嘛用的,That’s all.

完了之后发现自己还是什么都不会写。我想,算求,我直接看看别人怎么写的,自己再慢慢改造好了。

我看网易教程之前就是看到了一个下载百度贴吧里面的图片的一段代码,现在我还是找一个这样的吧。因为据说好多网页设置了禁止爬虫,或者要浏览器标识,这还要模拟浏览器操作,还有的AJAX加载的…还是贴吧的单页面简单点。

最初的是看的这个这个,决定修改第二个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#coding=utf-8
import urllib
import re

def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html

def getImg(html):
reg = r'src="(.+?\.jpg)" pic_ext'
imgre = re.compile(reg)
imglist = re.findall(imgre,html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' % x)
x+=1


html = getHtml("http://tieba.baidu.com/p/2522915602")

print getImg(html)

这个博主也说了,这段代码的正则不完善,会把src="http://absdsadsa ><div></div>sadsads.jpg这样的也筛选出来。
我修改了一下,我的正则也是忘了,又开始看的。最后修改成:http://.\S*?\.jpg,因为这个版本是py2的,我有一点点的折腾成py3的,真的是零基础,就这个玩意也折腾了半天。

最后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# -*- coding: utf-8 -*-
#

import urllib.request
import re

url = 'http://tieba.baidu.com/p/1457328558#!/l/p1'

html = urllib.request.urlopen(url).read()

html = html.decode()

reg = re.compile('http://.\S*?\.jpg')

imgList = re.findall(reg, html)

x = 60

with open('imgUrlList2.txt', 'w') as f:
for imgUrl in imgList:
urllib.request.urlretrieve(imgUrl, '%s.jpg' % x)
f.write(imgUrl)
f.write('\n')
x += 1
f.close()
print('Done!')

注:上面的地址是错的,这个页面是AJAX请求出来的,当时想抓这个页面的图片,所以改了,忘了改回来了。

抓取的url保存到文件里面是因为我想看看都是什么样的,debug的时候用的。

问题一

其实这里面最大的改变是正则。上面的正则可以看到博主原来的正则表达式里面是要匹配这样的字符串的src="http://123xsdsf.jpg",但是我有点不懂,我在官方文档里面看到urllib.request.urlretrieve方法接收的参数是url,但是博主写的前面带有src和双引号没看出来在什么地方去掉了。不知道是不是py2的urllib库能直接接收这样的参数。电脑上没有装py2,就没有弄了。所以我写的时候,直接过滤成url了。

问题二

因为JavaScript的编程习惯,在文件写入的时候,我想给每条记录前面添加一个序号。在JavaScript里面,数字和字符串是能直接一个加号就能直接连接的。Python里报了错,说这样不行。

这个问题还没解决。

今天又有任务了,先搞定工作吧。