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列表中随机选择一个UserAgent
userAgent = 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列表中随机选择一个UserAgent
userAgent = 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' + link
print(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' + link
loadImage(fulllink)
# 加载帖子中图片的链接地址
def loadImage(url):
# 在ua_list列表中随机选择一个UserAgent
userAgent = 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列表中随机选择一个UserAgent
userAgent = 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.jpg
f = 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 访问百度
编写如下代码:
# 导入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/')
练习
爬取粤嵌官网上的讲师信息
包括:讲师姓名、讲师职位、讲师简介、讲师图片
上一篇: EL与JSTL的介绍与使用