一、requests
requests库:python的第三方包,用来做接口测试和自动化测试已经爬虫
1.安装
在控制台中的终端(Teminal)中安装
pip install requests
2.导入
import requests
二、lxml库
lxml库是用于解析HTML中的数据
1.安装
在控制台中的终端(Teminal)中安装
pip install lxml
2.导入
form lxml import etree
三、BeautifulSoup
BeautifulSoup是python中解析html非常好用的第三方库;根据响应结果解析页面,提取数据
1.安装
pip install beautifulsoup4
2.导入
form bs4 import BeautifulSoup
3.用法
BeautifulSoup(网页源码,解析器)
4.解析器
序号 | 解析库 | 使用方法 | 优势 | 劣势 |
---|---|---|---|---|
1 | Python标准库 | BeautifulSoup(html,’html.parser’) | Python内置标准库;执行速度快 | 容错能力较差 |
2 | lxml HTML解析库 | BeautifulSoup(html,’lxml’) | 速度快;容错能力强 | 需安装C语言库 |
3 | lxml XML解析库 | BeautifulSoup(html,[‘lxml’,’xml’]) | 速度快;容错能力强;支持XML格式 | 需安装C语言库 |
4 | htm5lib解析库 | BeautifulSoup(html,’htm5llib’) | 以浏览器方式解析,最好的容错性 | 速度慢 |
链家二手房数据爬取
import requests
from bs4 import BeautifulSoup
import time
import random
import csv
# 创建文件
# 写入列名
file=open('./链家二手房.csv','w',encoding='utf-8')
mywrite=csv.writer(file)
data=[]
URL = 'https://cd.lianjia.com/ershoufang/rs/'
# 伪装爬虫
Headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'}
# 请求地址,获取响应结果
resp = requests.get(url=URL, headers=Headers)
# 判断状态码是否等于200.如果是就继续操作,如果不是则打印状态码
if resp.status_code == 200:
# 打印网页源代码
# print(resp.text)
# 将数据类型转换
soup = BeautifulSoup(resp.text, 'html.parser')
li_list = soup.select('body>div.content>div.leftContent>ul>li')
# print(len(li_list))
# 遍历
for i in li_list:
house_href = i.select_one('li>a').attrs['href']
# print(house_href)
# 请求更深层次的房屋详情页链接
house_resp = requests.get(url=house_href, headers=Headers)
# print(house_resp.text)
soup1 = BeautifulSoup(house_resp.text, 'html.parser')
# 小区名
communityName = soup1.select_one('div.communityName>a').text
print(communityName)
# 位置
areaName = soup1.select_one('div.areaName>span.info').text
print(areaName)
# 位置补充
supplement = soup1.select_one('div.areaName>a').text
supplement_1 = '暂无数据' if supplement == '' else supplement
print(supplement_1)
# 单价
# BeautifulSoup4使用text能够将一层标签下的所有内容取出来
unitPrice = soup1.select_one('span.unitPriceValue').text
print(unitPrice)
# 总价
totalPrice = soup1.select_one('div.price>span').text + '万'
print(totalPrice)
# 基本属性
baseInfo = soup1.select('div.base li') # 后代选择器
# 处理后的结果
baseInfo_list = [i.text for i in baseInfo]
print(baseInfo_list)
# 交易属性
transaction = soup1.select('div.transaction li>span')
trans_list = [i.text.strip() for i in transaction]
print(trans_list)
# 单行写入,多行写入
# 将数据写入文件:文件中数据越多写入越慢
data = [communityName, areaName, supplement_1, unitPrice, totalPrice]
data.append(baseInfo_list)
data.append(trans_list)
mywrite.writerow(data)
# 休眠--以秒为单位
# uniform(a,b)从a,b范围内随机取浮点数
time.sleep(random.uniform(1, 3))
# 用代理ip--在本机和网站之间有个中间ip
# 代理ip池:能够自动检测ip是否失效,能够自动补充池中ip的数量
break
else:
print(resp.status_code)
file.close()
在爬取数据的时候经常会遇到反扒机制
反扒机制
主要分为以下几种:
- User-Agent:将爬虫伪装成浏览器,例如豆瓣TOP250、职友集
- 字体反扒:将页面中重要信息使用符号进行隐藏,例如猫眼电影,瓜子二手车,大众点评,美团
- 动态页面:使用selenium模块–selenium是一个自动化测试模块,能够模拟人的行为
- 人机验证:九宫格选图片、选词、图片计算、字母数字验证码、滑动验证、短信验证
- 九宫格选图片–深度学习–崔庆才https://cuiqingcai.com/36060.html
- 选词–超级鹰
- 图片计算–光学文字识别
- 字母数字验证–easyocr、百度飞浆、百度AI开发者平台
- 滑块验证–selenium、pyautogui–不能直接让程序去拖,还要引入对应的物理原理
- 短信验证–接码平台
- 封IP:代理ip-极光代理IP、蘑菇代理、站大爷、芝麻代理
- 检测selenium:滑块验证无法托成功。例如淘宝
- 加入屏蔽selenium的代码
- 修改selenium驱动的底层代码
- 网页中的数据放到图片中:光学文字识别
- 必须登录才能使用
- 可以在requests中传入对应的cookie信息
- 在selenium中传入cookie
- 使用selenium操作登录的输入框、按钮