本来今天应该写的是phantomjs+selenium实现无界面的爬取信息,但是对于这个phantomjs有点不入门,所以今天就简单的说一下selenium。
单单对于selenium来说,安装上没有说的,就用pip进行安装就行(pip install selenium)。安装好了之后我们就开始探索抓取的方法了。首先我们来运行一个小的程序:
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')
运行这三行代码就可以打开火狐游览器中的百度界面。如果你发现程序出错了,那就看一下有没有把游览器放到环境变量中.其实还可以下载一个小程序,就可以解决这个问题
链接:https://pan.baidu.com/s/1o8ywUq2 密码:to4h
下一步就是模拟提交,也就是在建的网页中进行提交,
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("pycon")
elem.send_keys(Keys.RETURN)
print driver.page_source
上面的大部分懂了,然后就是对任务进行编辑:
首先我们要有一个逻辑,第一实现网页的创建和对人民网微博的登录;第二就是在登陆进去以后实现微博的翻页;第三步就是把每一个微博的评论找到实现微博和评论的爬取。
明白以后我们先看微博的登录:
#coding=UTF-8 import unittest import time import sys reload(sys) sys.setdefaultencoding('utf-8') from selenium import webdriver class PythonOrgSearch(unittest.TestCase):
#coding=UTF-8 import unittest import time import sys reload(sys) sys.setdefaultencoding('utf-8') from selenium import webdriver class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://t.people.com.cn/indexV3.action") elem = driver.find_element_by_xpath('//*[@id="userName"]') elem.send_keys("18133592036") ggg = driver.find_element_by_xpath('//*[@id="password_text"]') ggg.send_keys("qwertyuiop") driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click() driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click() driver.find_element_by_xpath('/html/body/div[2]/div/a').click() for p in range(1,4): print '第' + str(p) + '页' for k in range(1, 4): driver.maximize_window() driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") time.sleep(1) for m in range(1, 95): for k in driver.find_elements_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[4]/div[' + str(m) + ']/div[2]/div[4]/div[2]/a[3]'): k.click() time.sleep(0.1) # print m a = driver.find_elements_by_class_name('list_item') l = [] for i in a: if i not in l: l.append(i) for m in l: print m.text driver.find_element_by_class_name('wbp_pagelist_nextbtn').click()
def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://t.people.com.cn/indexV3.action") elem = driver.find_element_by_xpath('//*[@id="userName"]') elem.send_keys("账号") ggg = driver.find_element_by_xpath('//*[@id="password_text"]') ggg.send_keys("密码") driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click() driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click() driver.find_element_by_xpath('/html/body/div[2]/div/a').click() 在最下面的三行中,实现的是自动点击继续。我们再来看实现翻页和评论的爬取。
在实现这两个的要求的时候,我是先把评论都点了一下,在去实现整个网页的爬取,可是这种操作不是很好。因为在实现吧整个页面都点击一下的时候,当有一个人发的微博是转发的别人的微博,这个功能就会点击被转发人的主页,有了跳转的页面的情况,于是就有了下面的这种方法:
#coding=UTF-8 import unittest import time import sys reload(sys) sys.setdefaultencoding('utf-8') from selenium import webdriver class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://t.people.com.cn/indexV3.action") elem = driver.find_element_by_xpath('//*[@id="userName"]') elem.send_keys("账号") ggg = driver.find_element_by_xpath('//*[@id="password_text"]') ggg.send_keys("密码") driver.find_element_by_xpath('/html/body/div[3]/div[2]/div[2]/div[2]/form/div[4]/input').click() driver.find_element_by_xpath('/ html / body / div[2] / div / div[3] / a[2]').click() driver.find_element_by_xpath('/html/body/div[2]/div/a').click() for p in range(1,4): print '第' + str(p) + '页' for k in range(1, 4): driver.maximize_window() driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") time.sleep(1) for m in range(1, 95): for k in driver.find_elements_by_xpath('/html/body/div[1]/div[2]/div/div[1]/div[4]/div[' + str(m) + ']/div[2]/div[4]/div[2]/a[3]'): k.click() time.sleep(0.1) # print m a = driver.find_elements_by_class_name('list_item') l = [] for i in a: if i not in l: l.append(i) for m in l: print m.text driver.find_element_by_class_name('wbp_pagelist_nextbtn').click()
以上就是这次的程序。