爬取实例及自动化测试工具Selenuim模块

爬取城市名称:

 1 import requests
 2 from lxml import etree
 3 
 4 # 1.发送请求获取页面数据
 5 res = requests.get("https://www.aqistudy.cn/historydata/",
 6                    headers={
 7                        '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"
 8                    }
 9                    )
10 # 2.查看是否有防爬和编码问题
11 # print(res.text)   # 校验有无User-Agent,有的话在上方get请求时加上
12 # 3.生成一个xpath对象
13 tree = etree.HTML(res.text)
14 # 4.研究标签规律 书写xpath提取对应数据
15 
16 # 先获取热门城市
17 '''使用xpath选择器 开始的时候可以一层一层往下查找 无需跳跃'''
18 hot_city_names = tree.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
19 '''使用xpath选择器解析出来的结果肯定是一个列表'''
20 # 再获取其他城市
21 other_city_names = tree.xpath('//div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
22 
23 # 一次性查找所有的城市名称
24 all_city_names = tree.xpath(
25     '//div[@class="hot"]/div[2]/ul/li/a/text() | //div[@class="all"]/div[2]/ul/div[2]/li/a/text()')
26 print(all_city_names)
27 
28 """
29 使用xpath的规律就在于先明确你需要查找的标签
30 之后往上多看几层具有一定特征的父标签 之后依次逐层查找即可
31 """

爬取猪八戒数据:

 1 # 需求:公司名称 地址 价格 成交量 描述信息
 2 import requests
 3 from lxml import etree
 4 from openpyxl import Workbook
 5 
 6 wb = Workbook()
 7 wb1 = wb.create_sheet('订单数据', 0)
 8 wb1.append(['公司名称', '公司地址', '订单价格', '历史成交', '订单描述'])
 9 
10 # 1.发送请求获取页面数据
11 res = requests.get('https://shanghai.zbj.com/search/f/',
12                    params={'kw': 'app'}
13                    )
14 # 2.生成xpath对象
15 tree = etree.HTML(res.text)
16 # 3.研究标签规律 书写xpath
17 # 直接查找
18 '''直接查找很多时候是无法使用的 因为会出现数据混乱的现象'''
19 # company_name = tree.xpath('//div[@class="new-service-wrap"]/div/div/div/a/div[1]/p/text()')
20 # print(company_name)
21 # 先查找所有含有数据的div 之后依次循环
22 div_list = tree.xpath('//div[@class="new-service-wrap"]/div')
23 for div in div_list:
24     # 公司名称
25     company_name = div.xpath('./div/div/a/div[1]/p/text()')
26     # 如果获取不到公司名称 在该网站上是广告位
27     if not company_name:
28         continue
29     # print(company_name[-1].strip('\n'))
30     # 公司地址
31     address_info = div.xpath('./div/div/a/div[1]/div/span/text()')
32     # print(address_info[0])
33     # 订单价格
34     order_price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')
35     # print(order_price[0])
36     # 历史成交
37     order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
38     # print(order_num[0])
39     # 订单描述
40     order_desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()')
41     # print('app'.join(order_desc))
42 
43     wb1.append([company_name[-1].strip('\n'), address_info[0], order_price[0], order_num[0], 'app'.join(order_desc)])
44 
45 wb.save(r'订单数据.xlsx')

爬取贴吧图片数据:

 1 # 需求:贴吧名称是用户自己指定 不是固定的一个
 2     在编写程序的时候可以先以固定的为例之后换成用户输入即可
 3     所有的图片都需要自动保存到以贴吧名称命名的文件夹内
 4     贴吧图片支持多页爬取
 5     
 6 # 前期地址研究
 7     https://tieba.baidu.com/f?ie=utf-8&kw=%E4%B8%83%E9%BE%99%E7%8F%A0&fr=search
 8     https://tieba.baidu.com/f?ie=utf-8&kw=%E7%BE%8E%E5%A5%B3&fr=search
 9     https://tieba.baidu.com/f?ie=utf-8&kw=%E8%BE%A3%E5%A6%B9&fr=search
10     '''核心就在于kw参数'''
11     
12     https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=50
13     https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=100
14     https://tieba.baidu.com/f?kw=%E4%B8%83%E9%BE%99%E7%8F%A0&ie=utf-8&pn=150
15     '''核心就在于pn参数'''
16 
17 # 整体逻辑 先获取每个帖子的链接 之后请求再筛选图片
18 
19 import requests
20 from lxml import etree
21 import os
22 import time
23 
24 # 获取用户想要爬取的贴吧名称
25 tieba_name = input('请输入你想要爬取的贴吧名称>>>:').strip()
26 # 判断当前贴吧名称是否存在对应的文件夹
27 if not os.path.exists(tieba_name):
28     os.mkdir(tieba_name)
29 
30 # 1.发送请求
31 # TODO:多页数据 只需要再加一个pn参数即可
32 res = requests.get('https://tieba.baidu.com/f',
33                    params={'kw': tieba_name}
34                    )
35 # 2.生成一个xpath对象
36 tree = etree.HTML(res.text)
37 # 3.查找所有帖子的链接地址
38 a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href')
39 base_url = 'https://tieba.baidu.com'
40 # 4.循环获取每一个帖子链接 拼接成完整的地址 再发送请求
41 for link in a_link_list:
42     full_link = base_url + link
43     # 5.发送详情页请求获取页面数据
44     res1 = requests.get(full_link)
45     tree1 = etree.HTML(res1.text)
46     # 6.筛选图片链接地址
47     img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src')
48     # 7.循环请求每个图片地址 并保存图片
49     for img_src in img_src_list:
50         res2 = requests.get(img_src)
51         file_path = os.path.join(tieba_name,img_src[-15:])
52         with open(file_path,'wb') as f:
53             f.write(res2.content)
54     time.sleep(1)

selenium模块:

原本仅仅是为了测试领域里面的一款测试工具

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

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

 

# 1.模块下载 

  pip3 install selenium

 

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

# 下载网址http://npm.taobao.org/mirrors/chromedriver/2.38/

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

  """
  注意:有时候下载了驱动可能也无法操作浏览器
  原因:可能是因为驱动版本不对
  措施:重新一个版本的驱动


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

# 3.驱动文件的存放位置

  1.当前编程环境下(不推荐)
  2.任意位置只要能记住绝对路径(不推荐)
  3.存放到python解释器scripts文件夹内即可(推荐)

# 4.验证

from selenium import webdriver

import time

# 指定操作的浏览器驱动

bro = webdriver.Chrome()

# 控制浏览器访问网站数据

bro.get("www.baidu.com")

# 关闭浏览器窗口

time.sleep(3)

bro.close()

 

基本操作 :

"""

find_element与find_elements的区别就在于前者只会找到符合条件的第一个 后者是所有

两者的关系相当于bs4模块里面的find与find_all

"""

 1 # 1、find_element_by_id   根据id找
 2 # div_tag = bro.find_element_by_id('s-top-left')
 3 # 2、find_element_by_link_text     根据链接名字找到控件(a标签的文字)
 4 # a_tag = bro.find_element_by_link_text("新闻")
 5 # 3、find_element_by_partial_link_text   根据链接名字找到控件(a标签的文字)模糊查询
 6 # 4、find_element_by_tag_name       根据标签名
 7 # 5、find_element_by_class_name     根据类名
 8 # 6、find_element_by_name           根据属性名
 9 # 7、find_element_by_css_selector   根据css选择器
10 # 8、find_element_by_xpath          根据xpath选择
上一篇:又 看到 数学吧 的 两题


下一篇:一道数学题 : 数列 { bn } 收敛, 证明 { an } 也收敛