本来想爬六维空间(http://bt.neu6.edu.cn/)的搞笑图片来着。。。不知道为啥这两天上不去了。。。

于是就拿品知人大试一下python的这两个库。

用到的lxml函数可以参考:http://lxml.de/api/lxml.html.HtmlElement-class.html

主要的思路就是利用urllib获取网址内容,利用lxml解析特定规则的url。

要爬取的网页起始地址是:http://bt.ruc6.edu.cn/b/forum-36-1.html

一般写一个有递归逻辑的程序时,我喜欢先从最小的可以完成的单位写起。

那么,第一步,先点开一页,找一个图片的url,试一下能不能爬下来。

正好看到有一个我校『大白』的帖子(http://bt.ruc6.edu.cn/b/thread-222560-1-1.html)。ps:大白是学校里的一只流浪猫,据学校的流浪动物之家发的消息看,大白应该是3月初左右被中关村的一位漂亮的 IT MM 收养了。

第一张大白图片地址:http://bt.ruc6.edu.cn/b/data/attachment/forum/201604/14/215736wyrrrip32633fiaf.jpg

代码:

def get_page_string(url): # 因为获取网页字符串比较常用,所以就单独写成一个函数。return urllib.urlopen(url).read()def save_img(url):file_name = url.split('/')[-1] # 直接用网页上的图片名作为保存到本地的图片名if os.path.exists('pic/' + file_name):passelse:with open('pic/' + file_name, 'w') as of:of.write(get_page_string(url))

(为了简单方便起见,很多异常处理的代码都没有加,也不需要反爬虫。。。)大白照片见文章末尾。

第二步,找到这一页的想要爬取图片的url。

首先看一下,这几幅图片的xml路径

//*[@id="aimg_270475"]
//*[@id="aimg_270474"]
//*[@id="aimg_270473"]
。。。

看起来挺有规律的样子。不过,因为不知道其它的网页中的图片的id是怎么个样子,直接用id来爬并不好。

观察一下,发现这一页的所有图片都在标签是『td』中,而且其class属性是『t_f』。随便打开一个其它的网页也是这样的。那就暂时用这个线索来查找图片。

def iter_img(url):try:print get_page_string(url)doc = lxml.html.document_fromstring(get_page_string(url)) # 从网页的字符串中得到一个基本的HtmlElment,用于调用lxml提供的函数。element_class = doc.find_class('t_f')[0]# 这个返回的是一个数组,为了方便,只留第一个就行了。imgs = element_class.findall('.//img') # 找到这个路径下面所有的,标签是img的元素。for img in imgs:print img.attrib['src'] # 打印出属性为『src』的内容except:pass # 有时候请求不到就算了。。

试了一下,竟然没有返回结果。是网页保存到本地,再通过JS动态加载内容的吗?

那只好用selenium里面的WebDriverWait函数,等网页加载好了再解析喽。。

对于mac和linux的操作系统,要有一个Chromedriver。 在 http://download.csdn.net/detail/hooo/7819273 上下载。然后放到 /usr/local/bin/ 下。并将其权限改成可执行。

selenium里面的一些函数与lxml细节上有些出入,但整体思想并没有什么变化。用的时候,到它官网上找一下函数说明即可。

def iter_img_page(pageURL):driver = Chrome() # 调用浏览器driver.get(pageURL)WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.//ignore_js_op'))imgs = driver.find_elements_by_xpath('.//ignore_js_op/img') # 找到相应的标签。for img in imgs:img_url = img.get_attribute('src')# 打印出属性为『src』的内容print img_urlsave_img(img_url)

个人感觉,因为现在的框架实在是太多,一个人没必要也没那么多的时间去学。只要用的时候知道哪里去找就行了。

这次测试的完整代码如下:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# Author: lizhenyang_2008@163.com# This python program is used to draw pictures from bt.ruc6.edu.cnimport lxml.html # 用于解析html
import os
from selenium.webdriver import Chrome
from selenium.webdriver.support.ui import WebDriverWait
import urllib # 用于抓取网页内容rootURL = 'http://bt.ruc6.edu.cn/b/forum-36-1.html'
dabaiURL = 'http://bt.ruc6.edu.cn/b/data/attachment/forum/201604/14/215736wyrrrip32633fiaf.jpg'
dabaiPageURL = 'http://bt.ruc6.edu.cn/b/thread-222560-1-1.html'def get_page_string(url): # 因为获取网页字符串比较常用,所以就单独写成一个函数。return urllib.urlopen(url).read()def save_img(url):file_name = url.split('/')[-1] # 直接用网页上的图片名作为保存到本地的图片名if os.path.exists('pic/' + file_name): # 把图片放到本目录的'pic'文件夹下pass # 要是文件存在就不处理了。else:print 'saving', urlwith open('pic/' + file_name, 'w') as of:of.write(get_page_string(url))def iter_img(url): # 因为网页内容不是一次返回到客户端,所以这个函数就没用到。try:print get_page_string(url)doc = lxml.html.document_fromstring(get_page_string(url)) # 从网页的字符串中得到一个基本的HtmlElment,用于调用lxml提供的函数。element_class = doc.find_class('t_f')[0]# 这个返回的是一个数组,为了方便,只留第一个就行了。imgs = element_class.findall('.//img') # 找到这个路径下面所有的,标签是img的元素。for img in imgs:print img.attrib['src'] # 打印出属性为『src』的内容except:pass # 有时候请求不到就算了。。def iter_img_page(pageURL):driver = Chrome() # 调用浏览器driver.get(pageURL)WebDriverWait(driver, 100).until(lambda x: x.find_element_by_xpath('.//ignore_js_op'))imgs = driver.find_elements_by_xpath('.//ignore_js_op/img') # 找到相应的标签。for img in imgs:img_url = img.get_attribute('src')# 打印出属性为『src』的内容print img_urlsave_img(img_url)if __name__ == '__main__':# save_img(dabaiURL)iter_img_page(dabaiPageURL)

附大白照片

使用selenium等待网页加载完成,lxml解析网页,利用urllib爬取图片相关推荐

  1. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)

    引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待了,等待元素可见再继续运行程序: 注:当使用该放发的时 ...

  2. selenium 等待页面加载完成

    一.隐形加载等待: file:///C:/Users/leixiaoj/Desktop/test.html 该页面负责创建一个div <html> <head><titl ...

  3. python selenium 等待页面加载完毕_Selenium_等待页面加载完毕

    隐式等待 WebDriver driver = newFirefoxDriver(); driver.get("www.baidu.com"); driver.manage().t ...

  4. python selenium 等待js加载完成_一个用python完成的RSA成功模拟JS加密完成自动登录...

    编程工具启动图 自从做了产品,很久没有正二八经的写过代码了.最近这几天由于工作需要,一时心血来潮开始写python代码,最开始以为一个自动登录应该很简单,又没有手机验证和图片验证.结果一执行卡在一个加 ...

  5. 网页加载报错——URL网页连接错误

    当使用web视图控件,或者进行网络编程,需要涉及URL的,在ios9及xcode7之后版本,如果不进行配置,将会在控制台出现以下错误: App Transport Security has block ...

  6. uc点网页显示服务器升级,让uc浏览器网页加载速度提升100%

    摘要: 3G的最大特征就是网速的极大提升,而这正是 uc浏览器 手机浏览器的立身之本. 版本升级速度再提升100% 新发布的uc浏览器进一步改进了WAP/WEB网页的加载方式,不仅有效提高了浏览器的跳 ...

  7. python等待网页加载_Python Selenium等待(waits)页面加载完成的三种方法

    从网上load的: 网页常常会因为网络原因,程序问题等等导致打开网页慢,一直在那里打圈圈. 出现这种情况时网页里的很多元素就没有加载完成,如果你刚好要定位的元素没有加载完,这时定位的话程序就会抛出异常 ...

  8. webdriver 等待页面加载完成_Python爬虫,登陆神器Selenium等待(waits)页面加载的三种方法...

    网页常常会因为网络原因,程序问题等等导致打开网页慢,一直在那里打圈圈. 出现这种情况时网页里的很多元素就没有加载完成,如果你刚好要定位的元素没有加载完,这时定位的话程序就会抛出异常. 所以程序里要加入 ...

  9. Selenium自动化测试网页加载太慢怎么办

    遇到网页加载慢,selenium运行效率降低,可以通过修改页面加载策略提升自动化效率. selenium加载很慢 通过URL导航到新页面时,默认情况下,Selenium将等待文档完全被加载才会执行下面 ...

最新文章

  1. ndarray 与 array 的区别 关系,所以ndarray是一个类对象,而array是一个方法
  2. 「NLP」ALBERT:更轻更快的NLP预训练模型
  3. pyecharts学习(part2)--pyecharts Line
  4. 判断一个无符号整数是不是2的幂
  5. php validate form,laravel 中validate验证规则 利用FormRequest进行数据验证
  6. PHP 正则表达式资料
  7. cshop是什么开发语言_mes用什么语言开发?mes开发平台
  8. ps -ef|grep htpd|wd -l
  9. idea项目能放入eclipse_IDEA导入eclipse项目并且部署到tomcat的步骤详解
  10. h5聊天页面 jquery_基于Jquery WeUI的微信开发H5页面控件的经验总结(1)
  11. SQL编程题练习题(基础)
  12. Codewars练习题目
  13. Affinity笔记:渐变工具
  14. 苹果笔记本mac系统如何安装虚拟机?crossover22
  15. mysql修改校对集_关于MySQL字符集和校对集问题
  16. tp5.1 页面调取微信扫一扫识别条形码和二维码
  17. C#程序设计第三版(李春葆)第12章文件操作课后习题答案
  18. 按分数段统计学生人数python_用Excel统计各分数段学生数
  19. 做自媒体视频剪辑到哪里找素材?
  20. 超详细 WebPack 入门教程

热门文章

  1. ComboBox的SelectedText,SelectedItem,Text属性的区别
  2. 明白这3点,普通人也能用知识赚钱
  3. php new self()是什么意思
  4. Linux下permission denied
  5. [完全娱乐]“知音体标题”大公开
  6. QT实现一个图片透视变换的小玩意
  7. 全球及中国点胶机行业市场需求及投资风险评估报告2022-2028年
  8. 我快被食人花吃掉了。
  9. 小红书推广引流技巧分享
  10. 有趣php小程序,最近发现的 5 个微信小程序,有趣又实用!