spider_178_383 发表于 2023-9-22 17:48:38

百度反爬(百度贴吧爬虫)

<p data-track="140">
    前面我已经安装好了Selenium并模拟成功了一下打开百度页面并进行查询,让我这个python初学者信心倍增,今天再来试一试百度登录
   </p><p data-track="4">
   把打开百度的代码放到构造方法中
</p><p data-track="5">
   ps:那个文件目录是用于后面滑块验证图片保存的。
</p><p>
    def __init__(self):
   </p><p data-track="142">
    driver = webdriver.Chrome()
   </p><p data-track="143">
    driver.get('https://www.baidu.com/')
   </p><p data-track="144">
    driver.maximize_window()
   </p><p data-track="145">
    self.page = driver
   </p><p data-track="146">
    self.filename = 'G:\\scroll\\'
   </p><p data-track="12">
   点击右上角的“登录”按钮,打开登录框,
</p><p class="pgc-p" data-track="194">
<br/>
</p><p class="pgc-img-caption">
</p><p data-track="13">
   代码如下:
</p><p>
    driver = self.page
   </p><p data-track="148">
    driver.find_element(By.ID, 's-top-loginbtn').click()
   </p><p data-track="16">
   效果是这样:
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="198">
<br/>
</p><p data-track="17">
   输入用户名和密码,点击登录
</p><p>
    driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys('用户名')
   </p><p data-track="150">
    driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys('密码')
   </p><p data-track="151">
    driver.find_element(By.ID, 'TANGRAM__PSP_11__submit').click()
   </p><p data-track="21">
   运行之后,竟然出现了一个滑块验证窗口:
</p><p class="pgc-p" data-track="199">
<br/>
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="200">
<br/>
</p><p data-track="22">
   打算用selenium的鼠标事件,模拟拖拽滑块的功能
</p><p data-track="23">
   先获取滑块的id,发现id竟然是动态变化的,后面有个随机变化的数字
</p><p class="pgc-p" data-track="201">
<br/>
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="202">
<br/>
</p><p data-track="24">
   没办法,只能使用xpath获取页面元素
</p><p>
    /html/body/div/div/div/div/div
   </p><p data-track="26">
   再获取滑块要滑动的框的xpath
</p><p>
    /html/body/div/div/div/div/div
   </p><p data-track="28">
   并获取这个div元素的宽度,进行移动,代码如下
</p><p>
    flybutton = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div')
   </p><p data-track="155">
    ActionChains(driver).move_to_element(flybutton).perform()
   </p><p data-track="156">
<br/>
</p><p data-track="157">
    flybutton_div = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div')
   </p><p data-track="158">
<br/>
</p><p data-track="159">
    print(flybutton_div.size['width'], flybutton_div.size['height'])
   </p><p data-track="160">
<br/>
</p><p data-track="161">
    huakuia = ActionChains(driver)
   </p><p data-track="162">
    huakuia.click_and_hold(flybutton).perform()
   </p><p data-track="163">
<br/>
</p><p data-track="164">
    huakuia.move_by_offset(flybutton_div.size['width'], 0).perform()
   </p><p data-track="165">
<br/>
</p><p data-track="166">
    huakuia.release()
   </p><p data-track="42">
   运行了一下,效果是闪了一下,并没有滑动
</p><p data-track="43">
   思考良久,并查资料后看到一篇设置鼠标移动轨迹的文章,遂获得灵感,可能是移动的太快,被百度反爬工具发现了,于是每次5px循环的移动,
</p><p>
    flybutton = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div')
   </p><p data-track="168">
    ActionChains(driver).move_to_element(flybutton).perform()
   </p><p data-track="169">
<br/>
</p><p data-track="170">
    flybutton_div = driver.find_element(By.XPATH, '/html/body/div/div/div/div/div')
   </p><p data-track="171">
<br/>
</p><p data-track="172">
    print(flybutton_div.size['width'], flybutton_div.size['height'])
   </p><p data-track="173">
<br/>
</p><p data-track="174">
    huakuia = ActionChains(driver)
   </p><p data-track="175">
    huakuia.click_and_hold(flybutton).perform()
   </p><p data-track="176">
    x = flybutton_div.size['width']
   </p><p data-track="177">
    i = 0
   </p><p data-track="178">
    step = 5
   </p><p data-track="179">
    while i &lt; x:
   </p><p data-track="180">
    i = i + step
   </p><p data-track="181">
    huakuia.move_by_offset(step, 0).perform()
   </p><p data-track="182">
    time.sleep(3)
   </p><p data-track="183">
<br/>
</p><p data-track="184">
    huakuia.release()
   </p><p data-track="62">
   效果很好,哈哈~,我设置的移动一次休眠3秒,这个可以调快一些,不然心急的可能就认为没有生效。
</p><p class="pgc-p" data-track="203">
<br/>
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="204">
<br/>
</p><p data-track="63">
   滑动滑块是生效了,可是依然没有登录成功,因为系统要求的是把图片放正,并不是把滑块移动最右边
</p><p data-track="64">
   又进行了大量资料的查询,搜到一篇文章,是用python实现图片方向变换的功能,最关键的是里面实现了计算图片倾斜角度的计算,
</p><p data-track="65">
   地址是:python实现图片歪斜纠正+代码和注释
</p><p data-track="66">
   关键代码如下:
</p><p class="pgc-p" data-track="205">
<br/>
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="206">
<br/>
</p><p data-track="67">
   继续进行代码改进
</p><p data-track="68">
   保存图片:
</p><p>
    def save_pic(self, file):
   </p><p data-track="234">
    pic_url = self.page.find_element(By.XPATH, '/html/body/div/div/div/div/img').get_attribute('src')
   </p><p data-track="235">
    headers = {
   </p><p data-track="236">
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
   </p><p data-track="237">
    }
   </p><p data-track="238">
    res_s = requests.get(pic_url, headers=headers)
   </p><p data-track="239">
    data_s = res_s.content
   </p><p data-track="240">
    保存图片
   </p><p data-track="241">
    with open(file, 'wb') as f:
   </p><p data-track="242">
    f.write(data_s)
   </p><p data-track="79">
   获得图片倾斜角度
</p><p>
    def get_angle(self, file):
   </p><p data-track="208">
    # 读取图像
   </p><p data-track="209">
    img = cv2.imread(file)
   </p><p data-track="210">
    # 二值化
   </p><p data-track="211">
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
   </p><p data-track="212">
    # 边缘检测
   </p><p data-track="213">
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
   </p><p data-track="214">
<br/>
</p><p data-track="215">
    # 霍夫变换,摘自https://blog.csdn.net/feilong_csdn/article/details/81586322
   </p><p data-track="216">
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 0)
   </p><p data-track="217">
    for rho, theta in lines:
   </p><p data-track="218">
    a = np.cos(theta)
   </p><p data-track="219">
    b = np.sin(theta)
   </p><p data-track="220">
    x0 = a * rho
   </p><p data-track="221">
    y0 = b * rho
   </p><p data-track="222">
    x1 = int(x0 + 1000 * (-b))
   </p><p data-track="223">
    y1 = int(y0 + 1000 * (a))
   </p><p data-track="224">
    x2 = int(x0 - 1000 * (-b))
   </p><p data-track="225">
    y2 = int(y0 - 1000 * (a))
   </p><p data-track="226">
    if x1 == x2 or y1 == y2:
   </p><p data-track="227">
    return 0
   </p><p data-track="228">
    t = float(y2 - y1) / (x2 - x1)
   </p><p data-track="229">
    # 得到角度后
   </p><p data-track="230">
    rotate_angle = math.degrees(math.atan(t))
   </p><p data-track="104">
   改进后的滑块验证的代码如下:
</p><p data-track="244">
    huakuia = ActionChains(driver)
   </p><p data-track="245">
    huakuia.click_and_hold(flybutton).perform()
   </p><p data-track="246">
    x = flybutton_div.size['width']
   </p><p data-track="247">
    i = 0
   </p><p data-track="248">
    step = 5
   </p><p data-track="249">
    while i &lt; x:
   </p><p data-track="250">
    i = i + step
   </p><p data-track="251">
    huakuia.move_by_offset(step, 0).perform()
   </p><p data-track="252">
    time.sleep(3)
   </p><p data-track="253">
    filepath = self.filename + 'scroll' + str(i) + '.png'
   </p><p data-track="254">
    print(filepath)
   </p><p data-track="255">
    self.save_pic(filepath)
   </p><p data-track="256">
    angle = self.get_angle(filepath)
   </p><p data-track="257">
    print('current angle is : %s', angle)
   </p><p data-track="258">
    if math.fabs(angle) &lt; 3:
   </p><p data-track="259">
    break
   </p><p data-track="260">
<br/>
</p><p data-track="262">
    print('scroll complete')
   </p><p data-track="263">
    huakuia.release()
   </p><p data-track="126">
   运行之后,还是没有成功
</p><p data-track="127">
   最后发现计算的图片倾斜角度都是一样的,打开图片保存目录一看,是下面这样的:
</p><p class="pgc-p" data-track="264">
<br/>
</p><p class="pgc-img-caption">
</p><p class="pgc-p" data-track="265">
<br/>
</p><p data-track="128">
   原来相同一个图片,移动滑块旋转后保存的图片都是一样的,就是初始图片的样子, 怪不得失败了。。。
</p><p class="pgc-p" data-track="266">
<br/>
</p><p data-track="129">
   继续查资料,发现selenium有一个截图的功能,于是使用这个截图功能去保存旋转后的图片
</p><p data-track="132">
   保存图片后发现还是没有旋转前的图片,真是心累。。。。。
</p><p data-track="133">
   先记录在这里,后面再改进吧
</p>

dTdYM222029 发表于 2023-9-23 13:41:29

不错,支持下楼主

88v1e163688 发表于 2024-2-19 11:43:04

学习了,谢谢分享、、、

nGkhS112223 发表于 2024-2-19 14:07:32

我是个凑数的。。。

9Au1e920264 发表于 2024-4-1 11:05:13

有点意思,谢谢楼主的无私分享!!!

mRhbF338387 发表于 2024-4-1 11:05:18

牛啊兄弟 支持一下

HdJIe513079 发表于 2024-4-1 15:05:39

难得一见的好帖

K4nDV983130 发表于 2024-4-1 15:05:40

找到好贴不容易,兄弟们,顶起!

1i9rQ887242 发表于 2024-4-21 23:09:53

好好 学习了 确实不错

2GEtN285320 发表于 2024-4-22 09:07:28

好帖,来顶下
页: [1] 2 3
查看完整版本: 百度反爬(百度贴吧爬虫)