初等爬虫的学习过程1

来源:互联网 发布:淘宝千人千面收费吗 编辑:程序博客网 时间:2024/06/01 23:55

闲来无事,学习一下爬虫的编写过程,总归也算是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、最后贴一下简单的成果(成果就不贴了笑哭了)

0 0