Python—实训day4—爬虫案例3:贴吧图片下载
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:贴吧图片下载相关推荐
- Python—实训day2—爬虫案例1:访问百度贴吧
2 爬虫案例1:访问百度贴吧 假设我们要访问的贴吧是:动漫吧 头几页的URL地址为: https://tieba.baidu.com/f?kw=%E5%8A%A8%E6%BC%AB&ie=ut ...
- Python实训day4
'''2 爬取豆瓣TOP250电影信息3 4 主页:5 第一页:6 https://movie.douban.com/top250?start=0&filter=7 第二页:8 https:/ ...
- Python实训day14pm【Python网络爬虫综合大作业-参考解析】
Python实训-15天-博客汇总表 题目:天气数据的爬取和统计 大作业题目思路引导:定时爬取每个地级市的实时天气状况.存入excel中.为每个城市生成html展示.历史excel文件以每日为单位归档 ...
- Python实训day14am【Python网络爬虫综合大作业-答辩】
Python实训-15天-博客汇总表 实训总结: 由浅入深的了解了python语言应用: 编写了很多案例,完成了发作业,提升了编程思路和能力: 了解了行业现状,认识到企业对人才的要求,去除焦虑,对后续 ...
- Python实训day13am【Python网络爬虫综合大作业PPT】
Python实训-15天-博客汇总表 今天上午大家抓紧时间继续完成实训报告和PPT,有问题我会在群里跟大家说明, 暂时不用上线直播了. 实训结束后,我会在博客上发布网络爬虫综合大作业题目及解析.
- Python实训day12am【网络爬虫大作业简略解析:动态生成html页面、数据写入Excel】
Python实训-15天-博客汇总表 目录 1.HTML页面设计 2.生成每个城市的HTML页面 2.1.HTML页面代码(weatherTemplate.html) 2.2.实例代码-动态生成htm ...
- Python实训day06am【网络爬虫(爬取接口)】
Python实训-15天-博客汇总表 目录 1."from bs4 import BeautifulSoup"解析 2.字体反爬虫 3.网络爬虫 3.1.直接爬取页面html-爬取 ...
- 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 ...
- Python实训day05am【正则表达式、网络爬虫】
Python实训-15天-博客汇总表 目录 1.正则表达式 2.爬虫 论坛:掘金.csdn.博客园 刷题:力扣.牛客.实验楼 资料: w3.菜鸟.gitee W3school:https://w ...
最新文章
- setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
- TI CC2530的BasicRF与Zstack的同与异(重点讲了MAC层)
- java的输出的例子_Java例子:万年历的输出
- java Jsoup不能获取完整响应内容
- You have new mail in /var/spool/mail/root消除提示的方法
- virtual box和vmware有什么区别吗_真发假发套与普通假发有什么区别吗?
- 无需编码生成信息系统_无需编码即可逐步进行花分类
- Linux面试常考(面经总结)
- linux怎样删除链接文件,在 Linux 中怎样移除(删除)符号链接
- 一周信创舆情观察(9.27~10.10)
- html怎么给表头加斜线,如何为Excel中的表格表头添加斜线和文字?这才是正确的添加方式-excel表格斜线...
- cgcs2000大地坐标系地图_2000国家大地坐标系
- map拼接URL参数
- html+怎么播放avi视频,视频格式怎么修改?
- C语言goto语句 做一个自动关机小程序 —— 给小伙伴来个“恶作剧”吧
- 快速批量去除图片水印方法大全~~
- 【华为OD笔试真题JAVA实现】幼儿园找出同班的小朋友
- grub 2.0安装linux,grub2引导安装kali2.0及安装ibus拼音输入法
- 来自 http://www.seeitco.com/ 的各大IT公司薪资和待遇内幕(不断更新)[找工作的朋友必读!]
- 年薪20万、50万、100万的管理者,有什么分别?
热门文章
- android lcd驱动框架,LCD驱动及Framebuffer相关(转载)
- web python pkcs11_使用pkcs11模块用公钥加密数据失败
- 酷!GitHub开发者自研火星车,开发教程全面开源
- 电路常识性概念(6)-VCC、VDD和VSS三种标号的区别
- python3安装_Python 3.8.2安装教程
- java throwable判断,Java异常处理 Throwable实现方法解析
- shell 创建表 连接db2_大数据技术之SparkSQL(七)连接Hive数据库
- java udp 接收不定长_JAVA UDP通信为什么只能接收一次数据,我想要时刻接收数据,并更新UI,大神们帮我看看程序吧?...
- 需求获取安排计划书_6分钟教你写一份融资计划书
- arraylist从大到小排序_程序猿面试宝典:你该知道的数组排序算法