xpath模块的练习题

爬取城市名称

import requests
from lxml import etree

# 1.发送请求获取页面数据
res = requests.get("https://www.aqistudy.cn/historydata/",
                   headers={
                       'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36"
                   }
                   )
# 2.查看是否有防爬和编码问题
# print(res.text)  # 校验User-Agent
# 3.生成一个xpath对象
tree = etree.HTML(res.text)
# 4.研究标签规律 书写xpath提取对应数据

# 先获取热门城市
'''使用xpath选择器 开始的时候可以一层一层往下查找 无需跳跃'''
hot_city_names = tree.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
'''使用xpath选择器解析出来的结果肯定是一个列表'''
# 再获取其他城市
other_city_names = tree.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()')

# 一次性查找所有的城市名称
all_city_names = tree.xpath(
    '//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
print(all_city_names)
View Code

使用xpath的规律就在于先明确你需要查找的标签

之后往上多看几层具有一定特征的父标签 之后依次逐层查找即可

 

爬取猪八戒数据

需求:公司名称 地址 价格 成交量 描述信息

import requests
from lxml import etree
from openpyxl import Workbook

wb = Workbook()
wb1 = wb.create_sheet('订单数据', 0)
wb1.append(['公司名称', '公司地址', '订单价格', '历史成交', '订单描述'])

# 1.发送请求获取页面数据
res = requests.get('https://shanghai.zbj.com/search/f/',
                   params={'kw': 'app'}
                   )
# 2.生成xpath对象
tree = etree.HTML(res.text)
# 3.研究标签规律 书写xpath
# 直接查找
'''直接查找很多时候是无法使用的 因为会出现数据混乱的现象'''
# company_name = tree.xpath('//div[@class="new-service-wrap"]/div/div/div/a/div[1]/p/text()')
# print(company_name)
# 先查找所有含有数据的div 之后依次循环
div_list = tree.xpath('//div[@class="new-service-wrap"]/div')
for div in div_list:
    # 公司名称
    company_name = div.xpath('./div/div/a/div[1]/p/text()')
    # 如果获取不到公司名称 在该网站上是广告位
    if not company_name:
        continue
    # print(company_name[-1].strip('\n'))
    # 公司地址
    address_info = div.xpath('./div/div/a/div[1]/div/span/text()')
    # print(address_info[0])
    # 订单价格
    order_price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')
    # print(order_price[0])
    # 历史成交
    order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
    # print(order_num[0])
    # 订单描述
    order_desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()')
    # print('app'.join(order_desc))

    wb1.append([company_name[-1].strip('\n'), address_info[0], order_price[0], order_num[0], 'app'.join(order_desc)])

wb.save(r'订单数据.xlsx')
View Code

 

爬取贴吧图片数据

需求:贴吧名称是用户自己指定的 不是固定的一个

 

在编写程序的时候可以先以固定的为例之后再换成用户输入的即可

所有的图片都需要自动保存到以贴吧为名称命名的文件夹内

贴吧的图片支持多页爬取

 

前期的地址研究

https://tieba.baidu.com/f?ie=utf-8&kw=%E4%B8%83%E9%BE%99%E7%8F%A0&fr=search

https://tieba.baidu.com/f?ie=utf-8&kw=%E7%BE%8E%E5%A5%B3&fr=search

https://tieba.baidu.com/f?ie=utf-8&kw=%E8%BE%A3%E5%A6%B9&fr=search

结论核心在于kw后面的参数

 

多页爬取研究

https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=50

https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=100

https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=150

结论核心在于pn后面的参数

 

import requests
from lxml import etree
import os
import time

# 获取用户想要爬取的贴吧名称
tieba_name = input('请输入你想要爬取的贴吧名称>>>:').strip()
# 判断当前贴吧名称是否存在对应的文件夹
if not os.path.exists(tieba_name):
    os.mkdir(tieba_name)

# 1.发送请求
# TODO:多页数据 只需要再加一个pn参数即可
res = requests.get('https://tieba.baidu.com/f',
                   params={'kw': tieba_name}
                   )
# 2.生成一个xpath对象
tree = etree.HTML(res.text)
# 3.查找所有帖子的链接地址
a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href')
base_url = 'https://tieba.baidu.com'
# 4.循环获取每一个帖子链接 拼接成完整的地址 再发送请求
for link in a_link_list:
    full_link = base_url + link
    # 5.发送详情页请求获取页面数据
    res1 = requests.get(full_link)
    tree1 = etree.HTML(res1.text)
    # 6.筛选图片链接地址
    img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src')
    # 7.循环请求每个图片地址 并保存图片
    for img_src in img_src_list:
        res2 = requests.get(img_src)
        file_path = os.path.join(tieba_name,img_src[-15:])
        with open(file_path,'wb') as f:
            f.write(res2.content)
    time.sleep(1)

 

selenium模块

这款模块原本知识测试领域里面的一款测试工具

但是由于这款软件可以操作浏览器所以逐步也被应用到了爬虫领域

可以避免很多防爬措施但是由于需要操控浏览器所以效率上偏慢

 

1.模块下载

pip3 install selenium

2.驱动下载(必备条件)

这个模块是用来操作浏览器的 需要相应的驱动软件

注意事项:有时候下载了驱动也可能无法操作浏览器

                  原因:可能因为驱动的版本不对

                  解决措施:重新下载一个驱动

注意事项2:不同的浏览器需要下载不同的驱动文件

驱动程序网站:https://www.cnblogs.com/Dominic-Ji/p/9637715.html

3.驱动文件的存放位置

1.当前的变成环境下(不推荐)

2.任意位置只要能记住绝对路径(不推荐)

3.存放到python解释器scripts文件夹内即可(推荐)

4.验证

from selenium import webdriver

# 指定操作的浏览器驱动
bro = webdriver.Chrome()
# 控制浏览器访问的网站数据
bro.get('http://www.baidu.com')
# 关闭浏览器窗口
bro.close()

 

基本操作

find_element与find_elements的区别就在于前者只会找到符合条件的第一个 后者是所有
两者的关系相当于bs4模块里面的find与find_all

1、find_element_by_id #根据id找

 div_tag = bro.find_element_by_id('s-top-left') 

2、find_element_by_link_text     根据链接名字找到控件(a标签的文字)

 a_tag = bro.find_element_by_link_text("新闻") 

3、find_element_by_partial_link_text   根据链接名字找到控件(a标签的文字)模糊查询

 a_tag = bro.find_element_by_partial_link_text('东北') 

4、find_element_by_tag_name 根据标签名

5、find_element_by_class_name 根据类名

6、find_element_by_name 根据属性名

7、find_element_by_css_selector 根据css选择器

8、find_element_by_xpath 根据xpath选择

 

posted @ 2021-09-28 19:15  ふじわらたくみ  阅读(259)  评论(0编辑  收藏  举报