经过一段时间的学习,并参考各路大神的文章,总结出一些比较适合小白的网络爬虫的小技巧。跟着笔者的思路,循序渐进,可以慢慢找到一点小感觉。
开发环境
笔者选用的是vs code,轻量级,支持各种插件安装。
- 首先进入官网,下载python安装包,这里有一点要注意:默认下载是64位的python,建议从以下入口进入:
点击进入后,拉到最下面,可以选择64/32位的python安装。安装的时候,要勾选Add Python x.x.x To Path
(可省去手动配置环境变量),然后一路默认安装即可。 - 去官网下载vs-code,一路默认安装即可。
- 在vs-code中搜索
python
,选择第一项,安装python模块。
配置环境和依赖项
安装第三方库
pyhon
之所以受欢迎,得益于它的高效,简而言之,就是借助大量的第三方库。而且,很多强大的功能库,都提供支持python的api接口。
- 在cmd下执行
pip install selenium
,selenium是一款WEB自动化工具,主要用于网络爬虫、模拟登录等。 - 在cmd下执行
pip install pyautogui
,pyautogui有点类似于按键精灵,主要用于模拟人操作鼠标和键盘,可完美破解一些大型网站会有反爬机制。 - 在cmd下执行
pip install pylint
,pylint主要用于发现并分析编码中的错误。 - 在cmd下执行
pip install flake8
,flake8主要用于规范python编码格式。 - 在cmd下执行
pip install PyExecJS
,PyExecJS用于解析js格式文件,可用来清洗数据;
配置VS-CODE
- 设置tab 4字节缩进
- File - Preferences - Setting(快捷键:Ctrl+,),选择
user
选项卡 - 打开json文件,在
}
之前添加代码(保存好设置,重启vs code即可生效):
"editor.detectIndentation": false,
"editor.tabSize": 4, //vscode设置的缩进量
"editor.formatOnSave": false, //保存时候自动格式化,不建议设置。我在这里设置为false
- 在vs code中配置pylint和flake8
- File - Preferences - Setting(快捷键:Ctrl+,),选择
Worksapce
选项卡 - 打开json文件,添加如下代码(保存即可,不用重启):
{
"python.linting.flake8Enabled": true,
"python.formatting.provider": "yapf",
"python.linting.flake8Args": ["--max-line-length=248"],
"python.linting.pylintEnabled": false
}
- 将按两次F5运行,改为按一次
- 切换到
Run
选项卡,添加配置,打开lanuch.json,添加如下代码:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"stopOnEntry": false
}
]
}
安装WebDriver
基础学习
在学习过程中参考了很多好的资料,在此分享给大家。
- Python Selenium库的使用:
(1)https://blog.csdn.net/weixin_36279318/article/details/79475388
(2)http://www.testclass.net/selenium_python/
(3)https://selenium-python.readthedocs.io/index.html - 新手用vs code编写代码,经常报一些警告,可参考:
http://www.panxiaonan.cc/emlog/post-28.html - 网上一些模拟淘宝登录的文章
(1)https://blog.csdn.net/weixin_43407092/article/details/102975955
(2)https://blog.csdn.net/weixin_46089319/article/details/107861077?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-15&spm=1001.2101.3001.4242
模拟淘宝登录
- 打开淘宝网
from selenium import webdriver
from time import sleep
# 定义一个淘宝类
class TaoBao(object):
def __init__(self):
self.browser = webdriver.Chrome()
self.domain = 'http://www.taobao.com'
def open(self):
self.browser.get(self.domain)
sleep(3)
# main函数入口
if __name__ == "__main__":
tb = TaoBao()
tb.open()
- 元素定位
按F12进入控制台,定位到账号
和密码
输入框的位置
用selenium定义元素的api,这里推荐三个,其中find_element_by_xpath
最常用
# 获取账号编辑框,此处id和name一致纯属巧合
self.browser.find_element_by_id('fm-login-id')
self.browser.find_element_by_name('fm-login-id')
self.browser.find_element_by_xpath('//*[@id="fm-login-id"]')
为什么说通过xpath获取最常用呢,因为xpath是精准定位,且能直接拷贝获得。
定位其它网页元素,方法类似,不再赘述。
- 滑块验证
前面有提到过,selenium
可以模拟用户点击。
# 找到滑块位置
slider = self.browser.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
if slider.is_displayed():
# 拖拽滑块
self.action_chains.drag_and_drop_by_offset(slider, 258, 0).perform()
time.sleep(0.5)
# 释放滑块,相当于点击拖拽之后的释放鼠标
self.action_chains.release().perform()
- pyautogui模拟人工点击
前面有提到过,淘宝有反爬机制,能检测到selenium的模拟点击,会导致登录失败。那么,我们就借助pyautogui
模拟人工点击。
- 首先,用截图工具截图登录按钮的图片(最好用电脑自带的)
- pyautogui可以根据这张图片,找到登录按钮的位置,从而操作鼠标去点击
coords = pyautogui.locateOnScreen('1.png')
x, y = pyautogui.center(coords)
pyautogui.leftClick(x, y)
- 登录结果校验
点击登录按钮后,我们并不能直观的判断是否登录成功。此时,我们可以再次打开淘宝页面,查看用户名是否存在。
- 找到用户名的显示位置
- 获取用户名,因为
site-nav-user
不一定存在,故需要用try
处理异常
def get_nickname(self):
self.browser.get(self.domain)
time.sleep(0.5)
try:
return self.browser.find_element_by_class_name('site-nav-user').text
except NoSuchElementException:
return ''
- 最终代码
from selenium import webdriver
from time import sleep
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver import ActionChains
import pyautogui
import pymsgbox
pyautogui.PAUSE = 0.5
# 定义一个淘宝类
class TaoBao(object):
def __init__(self):
self.browser = webdriver.Chrome()
self.domain = 'http://www.taobao.com'
self.browser.maximize_window() # 窗口最大化
self.browser.implicitly_wait(5)
def open(self):
self.browser.get(self.domain)
sleep(1)
def login(self, usrname, passwd):
self.browser.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click() # 点击登录按钮
self.browser.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys(usrname) # 输入账号
self.browser.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys(passwd) # 输入密码
# 若出现滑块,需要模拟滑动
sleep(1)
try:
# 出现验证码,滑动验证
slider = self.browser.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
if slider.is_displayed():
# 拖拽滑块
ActionChains(self.browser).drag_and_drop_by_offset(slider, 258, 0).perform()
sleep(0.5)
# 释放滑块,相当于点击拖拽之后的释放鼠标
ActionChains(self.browser).release().perform()
except (NoSuchElementException, WebDriverException):
pass
# 模拟人工点击
try:
coords = pyautogui.locateOnScreen('1.png')
x, y = pyautogui.center(coords)
pyautogui.leftClick(x, y)
except TypeError:
pymsgbox.alert('未找到登录按钮')
# 验证登录结果
nickname = self.get_nickname()
if nickname:
pymsgbox.alert('登录成功,呢称为:' + nickname)
def get_nickname(self):
self.browser.get(self.domain)
sleep(0.5)
try:
return self.browser.find_element_by_class_name('site-nav-user').text
except NoSuchElementException:
return ''
# main函数入口
if __name__ == "__main__":
tb = TaoBao()
tb.open()
usrname = 'lgtxxxxxx'
passwd = 'xxxxxx'
tb.login(usrname, passwd)