目录
- 爬取城市名称
- 爬取猪八戒数据并写入表格
- 爬取贴吧图片数据
- 自动化测试工具selenuim模块
思路
1.向网页发送请求并携带请求头User-Agent参数
2.生成一个xpath对象并研究标签规律
3.利用xpath选择所需数据
4.打印结果
完整代码
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
import requests
from lxml import etree
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"
}
)
tree = etree.HTML(res.text)
# 先获取热门城市
hot_city_names = tree.xpath('//div[@class="hot"]/div[2]/ul/li/a/text()')
# 再获取其他城市
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
X-path爬取案例与selenuim模块
总结
1.使用x-path选择器,开始时可以一层一层往下查找 无需跳跃
2.解析出来的结果肯定是一个列表
3.使用x-path的规律就在于先明确你需要查找的标签,之后往上多看几层具有一定特征的父标签,之后依次逐层查找即可
1.朝网页发送get请求
2.生成xpath对象
3.研究标签规律,利用xpath模块筛选
4.先查找所有含有数据的div之后依次循环
5.利用解析器xpath筛选所需数据
6.导入openpyxl模块创建表格
7.定义表头以及写入数据最后保存文件
筛选数据详细步骤
# 公司名称
company_name = div.xpath('./div/div/a/div[1]/p/text()')
# 解决措施
if not company_name:
continue
# 公司地址
address_info = div.xpath('./div/div/a/div[1]/div/span/text()')
# 订单价格
order_price = div.xpath('./div/div/a[2]/div[2]/div[1]/span[1]/text()')
# 历史成交
order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
# 订单描述
order_desc = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()')
完整代码
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
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
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')
需求
贴吧名称是用户自己指定 不是固定的一个
在编写程序的时候可以先以固定的为例之后换成用户输入即可
所有的图片都需要自动保存到以贴吧名称命名的文件夹内
贴吧图片支持多页爬取
1.向网页发送get请求
2.生成一个xpath对象
3.查找所有帖子的链接地址
4.循环获取每一个帖子链接 拼接成完整的地址 再发送请求
5.发送详情页请求获取页面数据
6.筛选图片链接地址
7.循环请求每个图片地址并保存图片
如何实现用户自己想搜索的关键字
研究下来,发现核心在于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.查找所有帖子的链接
a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href')
2. 循环获取每一个帖子链接,拼接成完整的地址,再发送请求
base_url = 'https://tieba.baidu.com'
for link in a_link_list:
full_link = base_url + link
res1 = requests.get(full_link)
tree1 = etree.HTML(res1.text)
3.筛选图片链接地址
img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src')
4.循环请求每个图片地址,并保存图片,完整代码如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
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)
res = requests.get('https://tieba.baidu.com/f',
params={'kw': tieba_name}
)
tree = etree.HTML(res.text)
a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href')
base_url = 'https://tieba.baidu.com'
for link in a_link_list:
full_link = base_url + link
# 5.发送详情页请求获取页面数据
res1 = requests.get(full_link)
tree1 = etree.HTML(res1.text)
img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src')
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)
5.多页操作
研究发现在pn参数上
# 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
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
import requests
from lxml import etree
import os
import time
name = input('请输入想要爬取的贴吧名>>>:').strip()
if not os.path.exists(name):
os.mkdir(name)
page_str = input('请输入你要爬取的代码页数>>>:').strip()
page = (int(page_str) - 1) * 50
res = requests.get('https://tieba.baidu.com/f',
params={'kw': name,
'pn': page}
) # 通过额外参数控制贴吧和页数
# print(res.text)
tree = etree.HTML(res.text)
second_link_list = tree.xpath('//a[@class="j_th_tit "]/@href') # 筛选出所有帖子的链接部分
base_url = 'https://tieba.baidu.com'
for link in second_link_list:
url = base_url + link # 拿到一个个帖子的链接之后拼接获取完整网址
res1 = requests.get(url) # 访问一个个帖子的网址
tree1 = etree.HTML(res1.text)
img_link_list = tree1.xpath('//img[@class="BDE_Image"]/@src') # 筛选出帖子里图片的链接部分
for img_link in img_link_list:
res2 = requests.get(img_link) # 访问一个个图片的网址
file_path = os.path.join(name, img_link[-10:]) # 起名从后往前拿保证拿到.jpg
with open(file_path, 'wb') as f:
f.write(res2.content) # 写入保存
time.sleep(1)
selenium模块
原本仅仅是测试领域里面的一款测试工具
但是由于其可以操作浏览器所以逐步也被应用到了爬虫领域
可以避免很多防爬措施但是由于需要操控浏览器所以效率上偏慢
模块下载
驱动下载
该模块是用来操作浏览器的 需要相应的驱动软件
注意事项
# 1.有时候下载了驱动可能也无法操作浏览器
原因:可能是因为驱动版本不对
措施:重新下一个版本的驱动
# 2.不同的浏览器需要下载不同的驱动文件
驱动文件的存放位置
存放到python解释器scripts文件夹内即可
验证
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
from selenium import webdriver
import time
# 指定操作的浏览器驱动
bro = webdriver.Chrome()
# 控制浏览器访问B站网站数据
bro.get("https://www.bilibili.com/")
# 关闭浏览器窗口
time.sleep(3) # 设置延迟
bro.close()
基本操作
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标签的文字)模糊查询
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选择
结论
find_element与find_elements的区别就在于前者只会找到符合条件的第一个,后者是所有
两者的关系相当于bs4模块里面的find与find_all
小案例
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-YWan5yYmFzNxQTNkRTZllDZygDMlR2M5QjN4MWM0YTNiNTZk9CX5IzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.gif)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys # 键盘按键操作
import time
bro = webdriver.Chrome()
# 打开淘宝
bro.get('https://www.taobao.com/')
# 查找搜索框标签
input_tag = bro.find_element_by_id('q')
# 输入文本内容
input_tag.send_keys('iphone手机')
time.sleep(1)
# 点击搜索
input_tag.send_keys(Keys.ENTER)
time.sleep(5)
# 关闭浏览器
bro.close()