闲来无事,学习一下爬虫的编写过程,总归也算是python的重点应用方式啊。首先先对爬虫做一个总结,爬虫就是按照一个一个的链接爬满网络,然后将需要的内容保存下来。目前只是初级爬虫的编写,主要目的是学习流程。
1、爬虫爬虫首先要从一个链接开始,就显示蜘蛛一开始搭建的那根线,从那根线之爬满每一个链接,然后从这些链接中再向外爬,由此才可以爬完一个网站,或者再打一点爬满全网。搜索引擎就是爬虫功能的一个重要实例
2、首先获取初始链接,这次编写我们从真爱网开始玩起,目的是为了学习技术,首先使用python的urllib库,这个库可以直接获取网页的源代码,具体使用方式如下:
def gethtml(url):
page=urllib.urlopen(url)
html=page.read()
return html
这样就可以直接获取珍爱网首页的html信息再用
print gethtml(http://www.zhenai.com),将信息打印。单还要注意编码问题
2、在上一步里我们获得了珍爱网的首页html,单很明显首页是不会展示大量的图片的,许多的信息需要登录之后才能取得,在这时候urllib库就力不从心了,此时我选择selenium来进行模拟登录和以后的搜索操作
3、对于登录搜索这类简单的html操作,基本可以略过直接上代码:
def zhenai_login(myusername,mypassword):
browser = webdriver.Firefox()
browser.get('http://www.zhenai.com/')
time.sleep(3)
username = browser.find_element_by_id('jcLoginName')
username.send_keys(str(myusername))
password = browser.find_element_by_id('jcLoginPass')
password.send_keys(mypassword)
logon = browser.find_element_by_link_text('登录')
logon.click()
time.sleep(3)
search=browser.find_element_by_link_text('搜索')
search.click()
time.sleep(3)
return browser
此时我们就得到了一个登录后的搜索条件的webdriver对象,后面可以直接使用这个对象获取界面的html信息
4、现在我们又遇到了另一个问题,珍爱网的搜索必须手动向下才能自动加载更多的图片,因此我们需要模拟将界面向下拉的操作,这种操作可以用不同的方式实现,此处我使用的方式为直接加载js,代码如下:
def scroll(driver):
driver.execute_script("""
(function () {
var y = document.body.scrollTop;
var step = 100;
window.scroll(0, y);
function f() {
if (y < document.body.scrollHeight) {
y += step;
window.scroll(0, y);
setTimeout(f, 50);
}
else {
window.scroll(0, y);
document.title += "scroll-done";
}
}
setTimeout(f, 1000);
})();
""")
直接将在网页界面加载js代码,使之进行从上往下的翻页,就我估算每翻一次业大约有20张图片被加载,因此要获取大约500张图片就需要循环翻页25次,要是10000张就需要500次,希望你的浏览器可以挺住
5、现在我们获得了有大量图片链接的html代码,现在我们要做的就是讲html的图片链接都筛选出来,使用正则表达式进行筛选会更加方便,函数如下:
def getimage(html):
reg =r'<img[^>]*src\s*=\s*"([^"]*)"[^>]*>'
imgre=re.compile(reg)
imglist=re.findall(imgre,html)
return imglist
从函数中可以看出正则的重要内容为以
def downloadimage(imglist):
count=1
for img in imglist:
try:
urllib.urlretrieve(img,filename=u"E:/珍爱网图片/%s.jpg"%count)
except Exception,e:
print 'something si wroing:'+str(e)
count+=1
很简单的代码就不细说了,就主要使用rulretrive()函数,注意使用异常捕获,要不只要有一个图片链接出现问题,那整个函数就断掉了
7、最后贴一下简单的成果(成果就不贴了笑哭了)