Xpath模块实战与selenuim模块基本使用

概要

  • 爬取城市名称

  • 爬取猪八戒数据并写入表格

  • 爬取贴吧图片数据

  • 自动化测试工具selenuim模块


详细

  • 爬取城市名称

思路

1、先查看页面加载方式,城市名称是直接加载的。

2、向该页面发送get请求,收到状态码为403的响应,说明该网站有防爬措施。

3、在请求头中加入User-Agent参数模拟浏览器的标识。

4、利用响应内容构造xpath对象。

5、使用xpath,先明确需要查找的标签,往上查找具有一定特征的祖先标签,再逐级往下查找到名称标签,获取城市名称。

6、如果想要获取页面所有城市名称,即同时获取多个标签位置的数据,可以在xpath的参数中写入多条标签路径并用 | 分割。

import requests
from lxml import etree

# 1.基础链接
cityUrl = 'https://www.aqistudy.cn/historydata/'
# 2.发送请求
cityRes = requests.get(cityUrl,
                       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'}
                       )
# 3.生成xpath对象
cityHtml = etree.HTML(cityRes.text)
# 4.获取热门城市名称列表
hotCityList = cityHtml.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
# print(hotCityList)
# 5.获取全部城市名称列表
allCityList = cityHtml.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
# print(allCityList)
# 6.获取该页面全部城市名称
allCityNames = cityHtml.xpath('//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
print(allCityNames)


  • 爬取猪八戒数据并写入表格

思路

1、先查看页面加载方式,工作订单内容是直接加载的。

2、向该页面发送get请求

3、利用响应内容构造xpath对象。

4、使用xpath,由于会出现数据混乱,很多时候无法直接查找。

5、需要先明确需要查找的标签,往上查找具有一定特征的祖先标签,再逐级往下找到相关标签,获取工作相关信息。

import requests
from lxml import etree
from openpyxl import Workbook

# 1.创建Excel表格文件对象
wbWork = Workbook()
ws1 = wbWork.create_sheet('工作内容', 0)
ws1.append(['公司名称', '地址', '工作内容描述', '订单价格', '历史成交量(近半年)'])


def getWork(kw):
    """
        获取工作相关订单信息
    """
    # 1.设置网页基本链接
    workUrl = 'https://shanghai.zbj.com/search/f'
    # 2.发送请求获取页面数据
    workRes = requests.get(workUrl,
                           params={'kw': kw}
                           )
    # 3.生成xpath对象
    workHtml = etree.HTML(workRes.text)
    '''直接查找很多时候是无法使用的 因为会出现数据混乱的现象'''
    # companyName = workHtml.xpath('//div[@class="new-service-wrap"]/div/div/div/a/div[1]/p/text()')
    # print(companyName)
    # 4.先查找所有含有数据的div,再依次循环
    divList = workHtml.xpath('//div[@class="new-service-wrap"]/div')
    # 5.循环工作订单信息
    for div in divList:
        # 6.获取公司名称
        companyName = div.xpath('./div/div/a/div[1]/p/text()')
        # 7.发现有广告位,名称列表存在空值,添加判断
        if not companyName:
            continue
        # 8.去列表末位去除空格获取公司名称
        cName = companyName[-1].strip()
        # 9.获取公司地址
        addressInfo = div.xpath('./div/div/a/div[1]/div/span/text()')[0]
        # 10.获取订单价格
        price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')[0]
        # 11.获取成交量
        amount = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')[0].strip('近半年成交:')
        # 12.工作内容
        desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p//text()')
        # print(''.join(desc))
        # 13.添加至Excel表格
        ws1.append([cName, addressInfo, ''.join(desc), price, amount])

# 输入搜索关键字
kw = input('请输入工作内容: ').strip()
# 调用方法
getWork(kw)
wbWork.save('{}工作订单.xlsx'.format(kw))


  • 爬取贴吧图片数据

# 分析不同贴吧地址可知:kw参数不同,可以将kw参数作为用户可更改的变量传入
  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
# 思路 
1.先获取每个帖子的链接 
2.再发送请求 
3.在帖子内筛选出图片

import time
import os
import requests
from lxml import etree



def getTiebaImg(tName, pageNum):
    """
        获取贴吧图片
        tName: 贴吧名
    """
    # 1.设置搜索基础地址和贴吧地址
    searchUrl = 'https://tieba.baidu.com/f'
    baseUrl = 'https://tieba.baidu.com'
    # 2.发送请求
    # TODO:多页数据 只需要再加一个pn参数即可
    tRes = requests.get(searchUrl,
                        params={'kw': tName,
                                'pn': (pageNum-1) * 50
                                }
                        )
    # 3.利用响应文本生成xpath对象
    tHtml = etree.HTML(tRes.text)
    # print(tRes.text)
    # 4.循环帖子链接,拼接成完整地址,再向每个帖子发送请求
    aLinkList = tHtml.xpath('//a[@class="j_th_tit "]/@href')
    for link in aLinkList:
        fullLink = baseUrl + link
        # 5.向帖子发送请求
        tieRes = requests.get(fullLink)
        tieHtml = etree.HTML(tieRes.text)
        # 6.获取图片链接
        imgSrcList = tieHtml.xpath('//img[@class="BDE_Image"]/@src')
        # print(imgSrcList)
        """主动延迟"""
        time.sleep(2)
        for imgSrc in imgSrcList:
            # 7.向图片地址发送请求
            imgRes = requests.get(imgSrc)
            # 8.拼接文件路径并保存
            filePath = os.path.join(tiebaName, imgSrc[-16:])
            with open(filePath, 'wb') as f:
                f.write(imgRes.content)
                print('{}下载完成'.format(imgSrc[-16:]))
            """主动延迟"""
            time.sleep(1)



# 获取用户想要爬取的贴吧名称、页数
tiebaName = input('请输入你想要获得哪个贴吧的图片: ').strip()
pn = int(input('请输入你想要搜索的页数: ').strip())

# 判断是否存在名称为当前贴吧名称的文件夹
if not os.path.exists(tiebaName):
    os.mkdir(tiebaName)
# 调用函数
for n in range(1, pn + 1):
    getTiebaImg(tiebaName, pn)

 


  • 自动化测试工具selenuim模块

selenium原本是一款测试工具,可以操作浏览器,能避免很多防爬措施但是效率慢。

# 1.需要下载第三方模块
pip3 install selenium
# 2.需要下载驱动(必备)
该模块用于操作浏览器,针对浏览器需要不同的驱动程序
http://npm.taobao.org/mirrors/chromedriver/2.35/
# 3.存放位置 1.当前编程环境(不推荐) 2.任意位置,需要绝对路径(不推荐) 3.Python解释器的scripts目录中 注意:
  有时候下载了驱动可能也无法操作浏览器   原因:可能是因为驱动版本不对   措施:重新一个版本的驱动

测试小案例

from selenium import webdriver
import time

# 1.指定操作的浏览器驱动(简单粗暴版,不推荐)
# 如果找不到,可以手动配置浏览器绝对路径
# options = webdriver.ChromeOptions()
# options.binary_location = "C:\Program Files\Google\Chrome\Application\chrome.exe"
# bro = webdriver.Chrome(chrome_options=options)

# 1.指定操作的浏览器驱动
bro = webdriver.Chrome()
# 2.控制浏览器访问网站
bro.get('https://www.baidu.com')

# 关闭浏览器
time.sleep(3)
bro.close()

基本操作

1.find_element_by_id            根据id查找网页上的元素

eg:divTag = bro.find_element_by_id('s-top-left')

2.find_elementg_by_link_text       根据链接的文本找到a标签

eg:aTag = bro.find_element_by_link_text("新闻")

3.find_element_by_partial_link_text   根据链接文本模糊查找a标签

4.find_element_by_tag_name        根据标签名查找

5.find_element_by_class_name       根据类名查找

eg:tag = bro.find_element_by_class_name("mnav")

6.find_element_by_name          根据名称属性查找

7.find_element_by_css_selector     根据CSS选择器查找

8.find_element_by_xpath          根据xpath查找

 

posted @ 2021-09-28 14:46  Leguan001  阅读(118)  评论(0)    收藏  举报