0x01 初始化浏览器对象

bs=webdriver.Chrome()

0x02 访问网站

bs.get('https://antispider3.scrape.center/'

0x03 等待出现结果,然后再获取数据

wt=WebDriverWait(bs,10)#创建一个等待的对象,等待10秒
wt.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR,'.item')))#当节点id是item出现的时候获取数据
print(bs.page_source[:100]) #获取源码 前100个字节

0x04 获取网页源码并通过PyQuery初始化

html=bs.page_source
doc=py(html)

0x05 获取源码中所有类item下的类name

names=doc('.item .name')

CSS位置偏移反爬虫绕过_html

0x06 将获取的列表打印出来,并关闭创建的浏览器

for name in names.items():
print(name.text())
bs.close()

0x07 运行结果,发现字体的顺序都不对

Wonder
风 清 白 家
上 结 ( 宠 老 法 篇 终 的 妃 下 ) 册
士 为 知 己 ( 全 二 册 )
那 些 年 , 我 们 一 起 追 的 女 孩
全 倾 非 三 ( ) 城 我 册
明 些 儿 那 朝 事
我 和 你 的 笑 忘 书
王 小 波 全 集 第 一 卷
怦 然 动 心
龙枪编年史(全3册)
全 三 ( 奇 ) 传 册 枪 龙
明 黎 之 街
示 理 启 认 及 知 学 其 心
银河帝国2:基地与帝国
基 : 国 地 帝 河 银
解 四 年 - 材 教 学 下 文 小 全 级 语
越界言论(第3卷)

0x08 分析原因

正确的顺序应该是按后面的值排序,所以我们只要再获取一个style的值,然后进行排序

CSS位置偏移反爬虫绕过_python_02

def paixu(name):
ts=name('.whole')#一种根据类whole判断
if ts:
return name.text()
else:
chars=name('.char')#另一种根据类char判断
items=[]
for char in chars.items():#将过滤后的内容填写到一个列表里
items.append(
{'text':char.text().strip(),'left':int(re.search('(\d+)px',char.attr('style')).group(1))}
)
items=sorted(items,key=lambda x: x['left'],reverse=False)#根据关键字left排序
return ''.join([item.get('text') for item in items])#只返回text的内容

0x09 最终源码

import re


from selenium import webdriver
from pyquery import PyQuery as py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec




def paixu(name):
ts=name('.whole')
if ts:
return name.text()
else:
chars=name('.char')
items=[]
for char in chars.items():
items.append(
{'text':char.text().strip(),'left':int(re.search('(\d+)px',char.attr('style')).group(1))}
)
items=sorted(items,key=lambda x: x['left'],reverse=False)
return ''.join([item.get('text') for item in items])


bs=webdriver.Chrome()
bs.get('https://antispider3.scrape.center/')
wt=WebDriverWait(bs,10)
wt.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR,'.item')))
html=bs.page_source
doc=py(html)
names=doc('.item .name')


for i in names.items():
name=paixu(i)
print(name)
bs.close()

0x10 声明

本内容摘自《Python3网络爬虫开发实战 第二版》作者:崔天才

仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者不承担任何法律及连带责任。

欢迎关注公众号编程者吧