「爬虫」19利用PhantomJS编写爬虫程序
虽然PhantomJS的开发者已经停止更新了,但现存版本依旧可以使用,仍然可以用来解决爬虫中遇到的某些问题,所以还是很值得了解学习一下的。
(1)下载:https://phantomjs.org/download.html
官网windows版本下载(2)安装:
①解压压缩包到指定目录;
②将~/phantomjs/bin添加到主机环境变量中,在cmd中输入>>>phantomjs,进入phantomjs shell即为配置成功;
cmd模式进入PhantomJs③要在python IDLE中使用phantomjs,还必须安装selenium模块。
(3)基本爬虫使用方法:
前提:from selenium import webdriver
①打开
>>>browser=webdriver.PhantomJS()
②浏览网页
>>>url="http://www.baidu.com"
>>>browser.get(url)
③直接把爬取的网页截图
>>>browser.get_screenshot_as_file("G:/DA/file/pjs1.png")
④直接获取页面源代码
page_code=browser.page_source
⑤正则表达式提取网页title
Import re
pat_title="<title>(.*?)</title>"
title1=re.compile(pat_title).findall(page_code)
print(title1)
⑥xpath表达式提取网页title(必须先将page_code转为tree,再进行xpath提取)
from lxml import etree
edata=etree.HTML(page_code)
title2=edata.xpath("/html/head/title/text()")
print(title2)
⑦关闭浏览器
>>>browser.quit()
(4)实现自动登录豆瓣
豆瓣登录窗口①短信登录
PhantomJS实现短信验证登录②账号密码登录
PhantomJS实现账号密码验证登录【注】WebDriver8种基本元素定位方法:
①find_element_by_id():根据id属性进行定位;
例如:find_element_by_id(“one”)定位id为one的元素。
②find_element_by_name():根据name属性进行定位;
例如:find_element_by_name(“one”):定位name属性为one的元素。
③find_element_by_class_name():根据class的名字进行定位;
例如:find_element_by_class_name(“one”)定位class为one的元素。
④find_element_by_xpath():xpath是XML路径语言,通过确定xml文档中的元素位置来完成对元素的定位;
例如:find_element_by_xpath("//div[@id=‘one']")定位id为one的div元素;find_element_by_xpath("//*[@class=‘two']")定位class为two的元素。
⑤find_element_by_css_selector():根据css属性进行定位;
例如:find_element_by_css_selector("#one")定位id为one的div元素;find_element_by_css_selector(".two")定位class为two的元素。
⑥find_element_by_tag_name ():根据标签名进行定位;
例如:find_element_by_tag_name(“input”)定位input元素。
⑦find_element_by_link_text():根据完整a链接文字进行定位find_element_by_partial_link_text() 根据部分a链接文字进行定位;
例如:find_element_by_link_text(“新闻”) 定位文字为‘新闻'的a元素;find_element_by_partial_link_text(“闻”) 定位文字包括‘闻'的a元素。
⑧By定位( 需要导入By类:from selenium.webdriver.common.by import By );
例如:find_element(By.ID,“one”)定位id为one的元素;find_element(By.NAME,“one”)定位name属性为one的元素;find_element(By.CLASS_NAME,“one”)定位class为one的元素;find_element(By.TAG_NAME,“div”)定位div元素。
Ps:当定位元素为多个时,使用elements复数定位,即把定位方法中的element换成elements,此时获取到的为相同属性的一组元素,返回一个list队列,然后可以再去定位单个元素;
例如:find_elements_by_class_name(“one”)[1],定位class为one的所有元素中第二个元素。