声明:本文仅用于技术交流。
很多网站对爬虫封杀的很厉害,比如说天猫比如说拼多多,去抓取拼多多的时候,拼多多的前端anti_content参数我相信很多人都绕不过去,anti_content并且这个参数代码更改频繁,没有一定的功力很难破解。
本文介绍利用pyautogui模拟人操作去处理这种限制,无需再去处理anti_content这些参数。通过找到坐标点,然后模拟复制粘贴滚动点击等动作达到我们的目的。这些pyautogui都帮我们封装好了,我们要做的就是把整个流程代码化而已。相当的方便。
这里有个找坐标点的小技巧,推荐使用微信截图,截图的时候可以实时看到坐标点的位置。
要先说明的事,每个电脑的分辨力不一样,所以找到的点不一定适应所有电脑,推荐首先获取整个屏幕大小,然后按比例去处理坐标点的关系,可以提升程序的兼容性。这里有一段我写过的代码,仅供参考。
#从移动端获取
import random
import pyautogui
import time
import MySQLdb
import pyperclip
def scroll():
ino = 1
while ino % 30 != 0:
pyautogui.scroll(-random.randint(150, 180), 296, screenHeight / 2)
time.sleep(0.1)
ino = ino + 1
print(ino)
def search(name):
kposx = 214
kposy = 197
pyautogui.moveTo(kposx, kposy, 1)
pyautogui.click()
pyautogui.hotkey('ctrlleft', 'a')
pyautogui.press('backspace')
pyperclip.copy(name)
pyautogui.hotkey('ctrlleft', 'v')
pyautogui.hotkey('enter')
if __name__ == '__main__':
conn = MySQLdb.connect(host='localhost', port=3306, db='test',user='root', passwd='root',charset="utf8")
screenWidth, screenHeight = pyautogui.size()
cur = conn.cursor()
cur.execute("SELECT name FROM product")
rows = cur.fetchall()
i = 0
for row in rows:
if row[0]:
print(row[0])
search(row[0])
time.sleep(random.randint(3, 5))
i = i + 1
print(i)
当然:缺点也很明显,首先第一个缺点就是慢,因为是在浏览器中操作,所以会加载无关紧要大量的请求,所以时间成本高。如果我们只要某个请求的数据,我们可以结合Fiddler的脚本功能进行过滤保存即可。