最近有点空闲的时间,又不是很多,就想学点什么,之前听过那句话:生命苦短,我用python,然后就想觉得很适合,其实以前老听别人说爬虫爬虫,不知道是个什么鬼,借这个机会也了解下。
首先在w3school上面过了一遍python基础知识,真的看得人兴致全无,后来有各种找啊找,找到这个教程,跟着他入门,看着自己的程序跑起来的时候,终于觉得有意思了!
先写了个爬糗事百科的例子,知识爬段子,不爬图片,后来又写了个爬图片的例子,爬的是豆瓣图书的图片。
上代码:
import re
import urllib.request
import urllib
from collections import deque
url="http://www.qiushibaike.com/8hr/page/" #糗事百科的地址
f=open("aaa.txt","w")#把爬下来的段子存到这里 和项目在同一个目录
for i in range(1,10):#爬9页
real_url=url+str(i)
req = urllib.request.Request(real_url, headers={
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
})
oper = urllib.request.urlopen(req)
data = oper.read().decode('utf-8')
list=re.findall('<div class="content">([\s\S]*?)</div>',data) #查看糗事百科的源代码 你会发现段子的格式是这样的
for j in range(0,len(list)):
try: #如果没有try except的话爬到有些特殊字符会终止程序
f.write(list[j])
except:
continue
这个写完了之后就趁热打铁爬了豆瓣读书的图,只是为了练练手,图不是很多
import urllib.request import re import urllib url='https://market.douban.com/book/' req=urllib.request.Request(url,headers={ 'Connection': 'Keep-Alive', 'Accept': 'text/html, application/xhtml+xml, */*', 'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' }) data=urllib.request.urlopen(req).read().decode('utf-8') list=re.findall('<img src=\"(.*?)\" alt=\"\">',data)#匹配图片 alist=['https://market.douban.com'+x for x in list]#这里需要为爬下来的图片url加上https://market.douban.com才完整</span> for j in range(0, len(list)): f=open("pic"+str(j)+".jpg",'wb') #循环为图片取名字 pic=urllib.request.urlopen(alist[j]).read() f.write(pic) f.flush() f.close()
表示这个
'<img src=\"(.*?)\" alt=\"\">'
让我头痛了好一会儿,之前看得例子对双引号没有用转义字符,所以我也一直没有用,然后就什么都爬不下来,后来在我做笔记的一个小本本上看到了这么一段代码:
'href =\"(.*?)\" '
我看到了希望
改完后果然,,,很顺利
有三天打鱼两天晒网的毛病,不知道下次再学python的时候这些还记不记得,就留着罗(其实心里还是希望坚持下去的 我鄙视自己60秒)
其实这几行代码可以换成一行:
f=open("pic"+str(j)+".jpg",'wb') #循环为图片取名字
pic=urllib.request.urlopen(alist[j]).read()
f.write(pic)
f.flush()
f.close()
换成:
urllib.request.urlretrieve(alist[j],"pic"+str(j)+".jpg")