6 xpath

首先需要安装Google的Chrome浏览器

6.1 安装xpath插件

把 xpath_helper_2_0_2.crx 修改后缀名为 xpath_helper_2_0_2.rar。并解压

在Chrome浏览器中,访问 chrome://extensions/ 。打开开发者模式(把开关推动到右边)

点击“加载已解压的扩展程序”

选择 解压后的 xpath_helper_2_0_2 目录

安装后,留意右上角

这个,就是xpath插件

访问任意其他页面,比如www.baidu.com

然后,点击 xpath 插件按钮,会出现如下内容:左边的QUERY和右边的RESULT

可以在左边的QUERY输入查询的内容格式(//div),右边会呈现对应的结果。网页会有黄色

6.2 xpath语法

以贴吧为例:

https://tieba.baidu.com/f?kw=%E5%8A%A8%E6%BC%AB&ie=utf-8&pn=50

1. 查找标签

a 绝对路径(以//开头)

//div

//span

//a

b 相对路径(以./开头)

./div

./span

./a

c. 子路径(在父目录下查找子路径)

//div/span

//div/a

//ul/li/div/div/div/div/a

//ul/li//a

2 查找属性

格式:

标签名[@属性名=属性值]

比如:

//a[@class="j_th_tit"]

//div[@class="col2_left j_threadlist_li_left"]

//a[@class="frs-author-name j_user_card"]

3 读取属性

格式:

标签名/@属性名

比如:

//a[@class="j_th_tit"]/@href

//img[@class="j_retract"]/@src

4 获取内容

格式:

标签名/text()

比如:

//a[@class="j_th_tit"]/text()

//div[@class="col2_left j_threadlist_li_left"]/text()

//a[@class="frs-author-name j_user_card"]/text()

如果不写text(),实际上拿到的是标签。

如果写了text(),实际上拿到的是文本(字符串)

7 爬虫案例3:贴吧图片下载

目标:

访问贴吧,找出贴吧中每个帖子的链接

根据链接进入帖子,找出帖子中每张图片的链接地址

下载图片

需要用到xpath规则

7.1 获取内容

from urllib import request, parse
import ssl
import random# 常用User-Agent列表
ua_list = ['User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
]# 加载一个页面
def loadPage(url):# 在ua_list列表中随机选择一个UserAgentuserAgent = random.choice(ua_list)headers = {'User-Agent': userAgent}# 发起一个请求req = request.Request(url, headers = headers)#print(req)  # <urllib.request.Request object at 0x007B1370># 创建未经过验证的上下文的代码context = ssl._create_unverified_context()# 打开响应的对象response = request.urlopen(req, context=context)#print(response)  # <http.client.HTTPResponse object at 0x01F36BF0># 获取响应的内容html = response.read()# 对获取到的unicode编码进行解码content = html.decode('utf-8')return content
if __name__ == '__main__':url = 'https://tieba.baidu.com/f?kw=%E5%8A%A8%E6%BC%AB&ie=utf-8&pn=50'content = loadPage(url)print(content)

7.2 找出帖吧中帖子的链接地址

在python中使用xpath规则,需要安装库LXML

pip install lxml

pip install lxml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

参考代码

# 加载一个页面
def loadPage(url):# 在ua_list列表中随机选择一个UserAgentuserAgent = random.choice(ua_list)headers = {'User-Agent': userAgent}# 发起一个请求req = request.Request(url)#print(req)  # <urllib.request.Request object at 0x007B1370># 创建未经过验证的上下文的代码context = ssl._create_unverified_context()# 打开响应的对象response = request.urlopen(req, context=context)#print(response)  # <http.client.HTTPResponse object at 0x01F36BF0># 获取响应的内容html = response.read()# 对获取到的unicode编码进行解码content = html.decode('utf-8')# 使用etree对html的内容建立文档树content = etree.HTML(content)link_list = content.xpath('//a[@class="j_th_tit "]/@href')for link in link_list:fulllink = 'https://tieba.baidu.com' + linkprint(fulllink)

此时,可以把每个帖子的链接输出

7.3 找出帖子中图片的链接地址

# 加载贴吧中帖子的链接地址
def loadPage(url):...# 使用etree对html的内容建立文档树content = etree.HTML(content)link_list = content.xpath('//a[@class="j_th_tit "]/@href')for link in link_list:fulllink = 'https://tieba.baidu.com' + linkloadImage(fulllink)
# 加载帖子中图片的链接地址
def loadImage(url):# 在ua_list列表中随机选择一个UserAgentuserAgent = random.choice(ua_list)headers = {'User-Agent': userAgent}# 发起一个请求req = request.Request(url)# 创建未经过验证的上下文的代码context = ssl._create_unverified_context()# 打开响应的对象response = request.urlopen(req, context=context)# 打开响应的对象response = request.urlopen(req, context=context)# 获取响应的内容html = response.read()# 对获取到的unicode编码进行解码content = html.decode('utf-8')# 使用etree对html的内容建立文档树content = etree.HTML(content)link_list = content.xpath('//img[@class="BDE_Image"]/@src')for link in link_list:print(link)

7.4 把图片保存到文件中

# 加载帖子中图片的链接地址
def loadImage(url):...# 使用etree对html的内容建立文档树content = etree.HTML(content)link_list = content.xpath('//img[@class="BDE_Image"]/@src')for link in link_list:print(link)writeImage(link)
# 把图片下载并保存到本地
def writeImage(url):# 在ua_list列表中随机选择一个UserAgentuserAgent = random.choice(ua_list)headers = {'User-Agent': userAgent}# 发起一个请求req = request.Request(url)# 创建未经过验证的上下文的代码context = ssl._create_unverified_context()# 打开响应的对象response = request.urlopen(req, context=context)# 获取响应的内容image = response.read()# 把文件保存到文本filename = url[-10:] # f57882.jpgf = open(filename, 'wb')f.write(image)f.close()

7.5 用户输入参数

代码略。自行实现

8 selenium自动化工具

8.1 安装selenium插件

pip install selenium

8.2 安装phantomjs无界面浏览器

解压phantomjs压缩包,把bin所在的路径添加到环境变量 PATH 下

重启cmd命令行后,如果出现了 phantomjs 提示符,即表示该工具已经安装完成

8.3 访问百度

https://www.baidu.com/

编写如下代码:

# 导入selenium工具
from selenium import webdriver
# 通过浏览器去加载网页
driver = webdriver.PhantomJS()
# 打开网页
driver.get('https://www.baidu.com/')
# 截图
driver.save_screenshot('baidu1.png')

现在,浏览器访问百度首页的截图就保存到 baidu1.png 中了

8.4 进行搜索

# 导入selenium工具
from selenium import webdriver
# 通过浏览器去加载网页
driver = webdriver.PhantomJS()
# 打开网页
driver.get('https://www.baidu.com/')
# 截图
driver.save_screenshot('baidu1.png')# 找到要搜索的输入框控件
driver.find_element_by_id('kw').send_keys('古天乐')
# 截图
driver.save_screenshot('baidu2.png')
# 赵傲要点击的按钮控件
driver.find_element_by_id('su').click()
# 延迟1秒
import time
time.sleep(1)
# 截图
driver.save_screenshot('baidu3.png')

8.5 ChromeDriver

如果Selenium要和主流的浏览器关联,对应的浏览器需要安装驱动程序

比如:selnium要和 chrome关联,则Chrome需要安装ChromeDriver驱动

注意版本的对应

比如:现在Chrome版本为V85.0,则ChromeDriver也需要选择85.0的版本

在 http://npm.taobao.org/mirrors/chromedriver/ 上查找对应的版本并下载

解压后,把 chromedriver.exe 拷贝到 Chrome的安装目录下

C:\Program Files (x86)\Google\Chrome\Application

并把该路径添加到环境变量 PATH 路径下

# 导入selenium工具
from selenium import webdriver
# 通过浏览器去加载网页
#driver = webdriver.PhantomJS()
option = webdriver.ChromeOptions()
option.add_argument('headless')
driver = webdriver.Chrome(chrome_options=option) # 无界面的Chrome
#driver = webdriver.Chrome() # 有界面的Chrome
# 打开网页
driver.get('https://www.baidu.com/')

练习

爬取粤嵌官网上的讲师信息

包括:讲师姓名、讲师职位、讲师简介、讲师图片

import os
import requests
from lxml import etree# 保存设置
def down_load(imgpath, imgurl):response = requests.get(imgurl, headers=headers)with open(imgpath, 'wb') as f:f.write(response.content)# shutil.copyfileobj(response.raw,f)f.close()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
}# 提取内容
def pic_url(url, headers):pic_hxml = requests.get(url, headers=headers)html = etree.HTML(pic_hxml.text)pic1 = "//div[@class='teacher-img']/img[@class='lazy']/@src"name1 = "//div[@class='teacher-text']/h4/text()"job1 = "//div[@class='teacher-text']/h6/text()"inf1 = "//div[@class='teacher-text']/p/text()"pic2 = html.xpath(pic1)name2 = html.xpath(name1)job2 = html.xpath(job1)inf2 = html.xpath(inf1)for name, job, inf, pic in zip(name2, job2, inf2, pic2):imgurl = picpath1 = os.path.abspath('E:\PYTHON_PROJECT\homework')img_name = name + '-' + job + '.png'imgpath = os.path.join(path1, img_name)print(img_name, 'http://www.gec-edu.org/' + imgurl, inf)down_load(imgpath, 'http://www.gec-edu.org/' + imgurl)# 翻页设置
for i in range(1, 7, 1):url = 'http://www.gec-edu.org/teachers/' + str(i)pic_url(url, headers)

Python—实训day4—爬虫案例3:贴吧图片下载相关推荐

  1. Python—实训day2—爬虫案例1:访问百度贴吧

    2 爬虫案例1:访问百度贴吧 假设我们要访问的贴吧是:动漫吧 头几页的URL地址为: https://tieba.baidu.com/f?kw=%E5%8A%A8%E6%BC%AB&ie=ut ...

  2. Python实训day4

    '''2 爬取豆瓣TOP250电影信息3 4 主页:5 第一页:6 https://movie.douban.com/top250?start=0&filter=7 第二页:8 https:/ ...

  3. Python实训day14pm【Python网络爬虫综合大作业-参考解析】

    Python实训-15天-博客汇总表 题目:天气数据的爬取和统计 大作业题目思路引导:定时爬取每个地级市的实时天气状况.存入excel中.为每个城市生成html展示.历史excel文件以每日为单位归档 ...

  4. Python实训day14am【Python网络爬虫综合大作业-答辩】

    Python实训-15天-博客汇总表 实训总结: 由浅入深的了解了python语言应用: 编写了很多案例,完成了发作业,提升了编程思路和能力: 了解了行业现状,认识到企业对人才的要求,去除焦虑,对后续 ...

  5. Python实训day13am【Python网络爬虫综合大作业PPT】

    Python实训-15天-博客汇总表   今天上午大家抓紧时间继续完成实训报告和PPT,有问题我会在群里跟大家说明, 暂时不用上线直播了. 实训结束后,我会在博客上发布网络爬虫综合大作业题目及解析.

  6. Python实训day12am【网络爬虫大作业简略解析:动态生成html页面、数据写入Excel】

    Python实训-15天-博客汇总表 目录 1.HTML页面设计 2.生成每个城市的HTML页面 2.1.HTML页面代码(weatherTemplate.html) 2.2.实例代码-动态生成htm ...

  7. Python实训day06am【网络爬虫(爬取接口)】

    Python实训-15天-博客汇总表 目录 1."from bs4 import BeautifulSoup"解析 2.字体反爬虫 3.网络爬虫 3.1.直接爬取页面html-爬取 ...

  8. Python实训day05pm【JS-DOM-获取元素节点对象、网络爬虫】

    Python实训-15天-博客汇总表 目录 1.CSS选择器 2.网络爬虫 2.1.练习1 2.2.练习2 1.CSS选择器 .rank-body .book-mid-info .author a:n ...

  9. Python实训day05am【正则表达式、网络爬虫】

    Python实训-15天-博客汇总表 目录 1.正则表达式 2.爬虫    论坛:掘金.csdn.博客园 刷题:力扣.牛客.实验楼 资料: w3.菜鸟.gitee W3school:https://w ...

最新文章

  1. setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
  2. TI CC2530的BasicRF与Zstack的同与异(重点讲了MAC层)
  3. java的输出的例子_Java例子:万年历的输出
  4. java Jsoup不能获取完整响应内容
  5. You have new mail in /var/spool/mail/root消除提示的方法
  6. virtual box和vmware有什么区别吗_真发假发套与普通假发有什么区别吗?
  7. 无需编码生成信息系统_无需编码即可逐步进行花分类
  8. Linux面试常考(面经总结)
  9. linux怎样删除链接文件,在 Linux 中怎样移除(删除)符号链接
  10. 一周信创舆情观察(9.27~10.10)
  11. html怎么给表头加斜线,如何为Excel中的表格表头添加斜线和文字?这才是正确的添加方式-excel表格斜线...
  12. cgcs2000大地坐标系地图_2000国家大地坐标系
  13. map拼接URL参数
  14. html+怎么播放avi视频,视频格式怎么修改?
  15. C语言goto语句 做一个自动关机小程序 —— 给小伙伴来个“恶作剧”吧
  16. 快速批量去除图片水印方法大全~~
  17. 【华为OD笔试真题JAVA实现】幼儿园找出同班的小朋友
  18. grub 2.0安装linux,grub2引导安装kali2.0及安装ibus拼音输入法
  19. 来自 http://www.seeitco.com/ 的各大IT公司薪资和待遇内幕(不断更新)[找工作的朋友必读!]
  20. 年薪20万、50万、100万的管理者,有什么分别?

热门文章

  1. android lcd驱动框架,LCD驱动及Framebuffer相关(转载)
  2. web python pkcs11_使用pkcs11模块用公钥加密数据失败
  3. 酷!GitHub开发者自研火星车,开发教程全面开源
  4. 电路常识性概念(6)-VCC、VDD和VSS三种标号的区别
  5. python3安装_Python 3.8.2安装教程
  6. java throwable判断,Java异常处理 Throwable实现方法解析
  7. shell 创建表 连接db2_大数据技术之SparkSQL(七)连接Hive数据库
  8. java udp 接收不定长_JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?...
  9. 需求获取安排计划书_6分钟教你写一份融资计划书
  10. arraylist从大到小排序_程序猿面试宝典:你该知道的数组排序算法