本来想爬六维空间(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. 用ASP.NET AJAX框架扩展HTML Map控件
  2. python 螺旋数组_LeetCode54,螺旋矩阵,一题学会一个重要技巧
  3. linux常用高级命令,Linux常用高级文件操作命令
  4. 工作223:状态管理里面取值
  5. 全新一代人工智能计算引擎MaxCompute杭州开服,强化阿里云大数据能力,比肩谷歌微软...
  6. 三个梯度磁场_第二节 梯度磁场系统
  7. 播放视频时有残影、水纹的原因
  8. 网页英文 错位_网页错位原因解决方法
  9. 求一个任意实数的算术平方根的算法设计_感恩!面试必刷100道算法题
  10. Java 连接 数据库 (idea2022 + MySQL 演示,Oracle 通用)
  11. python snap7 plc_Python-Snap7获取西门子PLC 300数值
  12. 接线端子冲击和振动测试要求
  13. 嵌入式软件分层设计思想
  14. Excel怎么求和?5大常用的Excel求和公式
  15. 如何建立团队知识库管理系统,把分散信息有效整理?
  16. suger数据库使用1
  17. python动物农场小说网站爬虫_中文编程,用python编写小说网站爬虫
  18. armbian清理_N1刷入Armbian后保护emmc – 禁止varlog日志
  19. Android原生(Native)C开发
  20. ubuntu 18.04 安装caffe

热门文章

  1. Win10使用心得与技巧
  2. C#中ComboBox的SelectedIndexChanged事件获取Tag值
  3. 什么是机器学习?应用场景以及未来趋势
  4. [MRCTF2020]你能看懂音符吗
  5. 淘宝主图视频怎么上传?怎么抓取、下载?
  6. linux write函数耗时分析
  7. 学号20189220 2018-2019-2 《密码与安全新技术专题》第三周作业
  8. 我的科幻评论——《天年》:瑰丽的中国风末日小说
  9. 应用软件提示服务器正在运行,Win10开机提示服务器正在运行中怎么办?
  10. sqoop conditions原理