Day 015
一、爬虫
1.请求网页,获取响应结果
- 使用requests ,请求地址,获取响应结果。
2.解释网页,提取数据
- 根据前端的语法或者正则表达式提取数据。
3.数据持久化
- 将数据写入文件进行保存。
二、反爬机制和反反爬
1.User-Agent:将爬虫伪装成浏览器。例如:某瓣电影、某友集。
2.文字反爬:将页面中重要信息使用符号进行隐藏。例如:某眼电影、某子二手车、某众点评、某查查、某团等。
3.动态页面:使用selenium模块(自动化测试的模块),能够模拟人的行为使用浏览器。
4.人机验证:九宫格选图片、选成语(词语)、图片加计算公式、字母数字验证码、滑块验证码、短信验证等。
- 九宫格选择图片 —> 深度学习。https://cuiqingcai.com/36060.html。
- 选成语或者词语 —> 深度学习。超级鹰。
- 图片加计算公式、字母数字验证码 —> 光学文字识别(OCR):easyocr、百度飞桨、百度AI开发。者平台等。
- 滑块验证:selenium、pyautgui—> 引入对应的物理原理。
- 短信验证:等待、解码平台。
5.封IP:代理IP:某光代理IP、某菇代理、莫大爷、某麻代理等。
6.检测selenium:滑块验证无法拖成功,例如:某宝---->
a.加入屏蔽selenium的代码。
b.修该selenium驱动的底层代码。
7.网页中的数据放在图片中:光学文字识别。
8.登陆使用:淘宝可以在requests中传入cookie信息。或者在selenium中传入cookie。或者使用selenium操作登陆的输入框、按钮
补充 : RPA —> 机器人流程自动化(影刀、八爪鱼、壁虎等)—> 从selenium进行的演变
三、BeautifulSoup4
1.BeautifulSoup4 - 根据响应结果解析页面、提取数据
- BeautifulSoup(网页源码,解析器) --> 将字符串类型的源代码转换为bs4类型学·
- bs4模块提供了一系列提取数据的方法,这些方法的操作对象的bs4类型的数据。
+select:根据CSS选择器(标签、class、id等)定位数据, - 得到的是符合这个选择器的所有结果(整体是列表,列表中每个元素是一个bs4类型的数据)
- select_one:根据CSS选择器(标签、class、id等)定位数据,
- 得到的是符合这个选择器的一个结果(是一个bs4类型数据)
- text:从bs4类型数据中提取标签内的内容,结果为str
- attrs:从bs4类型数据中提取标签内容属性值,结果为str
2.headers = {}
- headers是一个字典:{key:value}
- headers是给爬虫提供伪装的
- User-Agent --> 将爬虫伪装成浏览器
- User-Agent获取方法
3.对比页面数据内容是否一致
+网页:分为静态页面和动态页面
- 静态页面:内容的写死的,除非人为的进行内容修改,否则这个页面的内容是一成不变的。
- 动态页面:内容不是写死的,使用某种特殊的技术(JavaScript)使数据通过某种方式显示在页面中。
- requests得到的结果是静态页面的结果
练习-试对某家二手房进行数据爬取
import requests
from bs4 import BeautifulSoup
import time
import random
from tqdm import tqdm
for page in tqdm(range(1, 101)):
print(f'第{page}页')
URL = f'https://cd.某家.com/ershoufang/pg{page}/'
# 伪装爬虫
Headers = {
'User-Agent': '此处输入自己的信息即可'
}
# 请求地址,获取响应结果
response = requests.get(url=URL, headers=Headers)
if response.status_code == 200:
# print(response.text)
soup = BeautifulSoup(response.text, 'html.parser')
li_list = soup.select('body > div.content > div.leftContent> ui > li')
print(len(li_list))
for i in li_list:
house_href = i.select_one('li>a ').attrs['href']
print(house_href)
# 请求更深层次的房屋详情页链接
house_response = requests.get(url=house_href,headers=Headers)
print(house_response.text)
soup1 = BeautifulSoup(house_response.text,'html.parser')
# 小区名字
house_name = soup1.select_one('div.communityName > a ').text
print(house_name)
# 位置
areaName = soup1.select_one('div.areaName > span.into').text
# 补充
supplement = soup1.select_one('div.areaName > a').text
# print(supplement,type(supplement),len(supplement))
supplement_1 = '暂无数据' if supplement == ''else supplement
print(supplement_1)
# 单价
# BeautifulSoup4能够将一层标签下的所有内容取出来。
unitPrice = soup1.select_one('span.unitPriceValue').text
print(unitPrice)
# 总价
totalPrice = soup1.select_one('div.price > span').text + '万'
print(totalPrice)
# 基本属性
baseInto = soup1.select('div.base li')
print(baseInto)
# 处理后结过
baseInto_In_list = [i.text for i in baseInto]
# 交易属性
changeInto = soup1.select('div.transaction li > span')
print(changeInto)
# changeInto_list = [i.text.replace('\n','')for i in changeInto]
changeInto_list = [i.text.strip() for i in changeInto]
print(changeInto)
# 可单行写入 可多行写入
# 休眠--->以秒为单位
# uniform(a,b)从范围内随机取浮点数
time.sleep(random.uniform(1,3))
# 使用代理IP, ----> 代理IP池(自动检测IP是否失效,能够即使补充池中的数量)
else:
print(response.status_code)