欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-26 23:30:32
...

6 xpath

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

6.1 安装xpath插件

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

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

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

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

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

选择 解压后的 xpath_helper_2_0_2 目录

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

安装后,留意右上角

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

这个,就是xpath插件

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

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

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

可以在左边的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

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

参考代码 

# 加载一个页面
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)

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

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

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 下

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

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

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

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 路径下

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

# 导入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/')

练习

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

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

 

 

 

 

 

 

 

 

 

 

 

相关标签: Python