用到的类库

mouse类库

方法树
mouse
move(x,y) 移动鼠标
click 点击左键
应用场景
点击方式的验证码
自动化测试。。。
屏幕坐标获取工具

pickle类库

方法树
dump 序列化

新建一个spider

新建一个爬虫文件

  1. import scrapy
  2. from selenium import webdriver
  3. import time
  4. class ZhihuSpider(scrapy.Spider):
  5. name = "zhihu"
  6. allowed_domains = ["www.zhihu.com"]
  7. start_urls = ["https://www.zhihu.com/"]
  8. def start_requests(self):
  9. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver")
  10. browser.get("https://www.zhihu.com/#signin")
  11. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[1]/div[2]').click()
  12. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[2]/div/label/input').send_keys("15208961314")
  13. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/div[3]/div/label/input').send_keys("15208961314")
  14. browser.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[1]/div/form/button').click()
  15. time.sleep(60)

配置到main中

在main文件中,把原先的spider类名换成当前创建的spider类名
image.png

网站防御机制(对于selenium)

有的网站会识别到我们chromedriver,因为有一些js变量带chromedriver字符串,所以网站识别出来了,会对我们的行为做一些限制。
image.png

下载chrome60 driver2.33

换回低版本的chrome

驱动远程监听端口 (推荐)

命令行
注意:启动前把所有chrome实例都关掉
通过命令行将驱动通过远程监听端口命令打开

  1. 绝对路径/chrome --remote-debugging-port=9222
  1. # mac则把exe去掉
  2. /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222

打开网页
  127.0.0.1:9222/json 测试是否启动成功
代码形式

  1. from selenium.webdriver.chrome.options import Options
  2. chrome_option = Options()
  3. chrome_option.add_argument("--disable-extensions")
  4. chrome_option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
  5. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver",chrome_options=chrome_option)

去掉特性(推荐)

  1. option = webdriver.ChromeOptions()
  2. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  3. browser = webdriver.Chrome(executable_path="/Users/user3/python/selenium/chromedriver",
  4. chrome_options=option)

selenium防止追加字符串

当有cookie的情况下,可能浏览器会自动填充文本框,这不是我们想要的

  1. send_keys(Keys.CONTROL+"a')

模拟cookie

有的时候,我们已经登陆过账号了,在爬虫时,则需要模拟cookie来登陆

代码

初次

  1. cookies = browser.get_cookies()
  2. pickle.dump(cookies,open(cookies文件夹绝对路径))
  3. cookie_dict={}
  4. for cookie in cookies:
  5. cookie_dict[cookie["name"]] = cookie["value"]
  6. return [scrapy.Request(url=self.start_urls[0],dont_filter=True,cookies=cookie_dict)]

非初次 - 因为初次我们已经把cookie 输出成文件了,所以以后都只需要从文件中load就行

  1. cookies = pickle.load(open("cookie文件的绝对路径"))
  2. cookie_dict={}
  3. for cookie in cookies:
  4. cookie_dict[cookie["name"]] = cookie["value"]
  5. return [scrapy.Request(url=self.start_urls[0],dont_filter=True,cookies=cookie_dict)]

setting设置

  1. # 从浏览器某个请求的request中可以获取这串参数
  2. USER_AGENT("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36")
  1. # 有了这个设置,后续的request不需要添加cookie
  2. COOKIES_ENABLED = True
  3. COOKIES_DEBUG = True

整个模拟登陆流程

有cookie直接配置cookie自动会登陆上
没cookie则用selenium模拟操作,模拟操作中为了避免cookie的自动填充,需要模拟“全选后再输入”的行为,要去掉chrome驱动的特性,否则请求会被浏览器驳回。