学习之路特别无聊,想着练习的时候记录一下,这样最起码看着自己学过,要不然以后忘了都感觉自己白学了。
python实现爬取页面的功能其实很简单,就是通过python自带的库urllib中的request,然后将页面内容写入到一个文件当中,然后可以在本地通过浏览器打开,这就是简单的爬取页面。
废话不说,来点代码感受一下:
from urllib import request
def f(url):
print("URL : %s " %url)
resp = request.urlopen(url)
data = resp.read()
f = open('url.html','wb')
f.write(data)
f.close()
print('%d bytes received from %s.' % (len(data), url))
if __name__ == '__main__':
url = 'https://blog.csdn.net/Oh_my_godness/article/details/84572933'
f(url)
这个代码呢就是将该链接匹配的网页下载到当前目录的url.html中
但是一般爬取页面不会一个一个去爬取,太费劲了,对于我们这种那么懒得程序员,怎么可能忍受,当然要偷懒了,所以这就面对这大量的页面爬取,今天先不说线程,说一种很高效的‘协程’,也就是一个线程中遇见IO进行切换的操作,给人感受上达到了线程并行的功能,也更快的完成页面内容爬取。那就来点代码看看喽:
from urllib import request
import gevent
from gevent import monkey
monkey.patch_all()
def f(url):
print('URL : %s' %url)
resp = request.urlopen(url)
data = resp.read()
print('%d bytes received from %s.' % (len(data), url))
gevent.joinall([
gevent.spawn(f,'https://blog.csdn.net/oh_my_godness'),
gevent.spawn(f, 'https://blog.csdn.net/Oh_my_godness/article/details/84453915'),
gevent.spawn(f,'https://blog.csdn.net/Oh_my_godness/article/details/84572933')
])
这里面的gevent,帮助该功能更快的实现请求的响应,这里的monkey如果没有的话,会感受收跟同步的是没有的区别的,主要原因是urllib该库在执行的过程中,gevent不能自动扫描出其中的IO操作,也就是不能切换,二monkey就给当前程序所有的IO操作都做了标记,可以让gevent发现,然后进行切换,实行效果上得‘并行’。