有时候我们会需要登录网站爬取信息,现在的验证码比较复杂,为了实现爬取,咱就想到一个方法,可以通过py打开浏览器方式,手动登录后在进行爬取,省略了登录的复杂程度,下面开始详细说一下过程,以谷歌Chrome为例:
访问网址:http://chromedriver.storage.googleapis.com/index.html 以获得对应版本、系统的驱动并下载,并分别放置到Chrome的安装目录,python的安装目录。
打开浏览器并访问目标网址
import re
import requests # 使用网络模块
import base64
from bs4 import BeautifulSoup # 网页拆分,需要使用pip指令安装
import time # 导入时间模块,延时器使用
from splinter import Browser # 操作浏览器模块,需要pip安装
# from fontTools.ttLib import TTFont, BytesIO
# 注意:py有着严格的缩进管理
#win下安装建议使用网址:www.continuum.io/downloads/ 此版本编译器与Linux一致,错误率低
#安装常用套件:使用命令 pip install
#requests(网络模块) BeautifulSoup4 jupyter(网页运行器)
url = 'http://test.baidu.com/crowdtest/communityAcademy/detail?id='
# a.启动浏览器访问主链接
browser = Browser('chrome')
browser.visit('http://test.baidu.com/')
# b.等待手动登录倒计时
# print('请输入预计登录需要的操作时间,单位秒(s):')
# login_time = input()
# for idx in range(int(login_time), -1, -1):
# time_str = '等待手动登录中,还有:' + str(idx) + '秒……'
# print(time_str, end = "")
# print("\b" * (len(time_str)*2), end = "", flush = True)
# time.sleep(1)
# print('登录完成,开始获取数据……')
# 比较麻烦,直接换成判断
# c.等待登录判断
print('在手动登录完成后,请键入“y”并回车')
login_yn = input()
if login_yn == 'y':
print('请输入预计页数,注意,不要超出所提取页:')
page_no = input()
print('请输入保存文件名:')
save_file_name = input()
print('开始检索……,请稍后')
# 初始化导出数组
export_file_arr = []
for idx in range(int(page_no)):
time.sleep(3) # 每次刷新网页都需要休息3秒
curr_url = url + str(idx + 2)
# 操作浏览器打开当前循环的URL
browser.visit(curr_url)
# 在dom元素上右键即可获得xpath
curr_title = browser.find_by_xpath('//*[@id="ng-app"]/body/div[2]/div/div[2]/div/div/div[2]').first.value
print_str = '正在执行检索,全部:' + page_no + '页,当前:' + str(idx) + '页,标题内容:' + curr_title
# 统计数字清空
print(print_str, end = "")
print("\b" * (len(print_str)*2), end = "", flush = True)
export_file_arr.append(str(idx) + ':' + curr_title + '【' + curr_url + '】' + '\n') # 追加当前标题到数组
# d.执行导出
print('检索完成,是否保存检出记录到txt文本?y / n')
export_yn = input()
if export_yn == 'y':
# 开始导出操作
print('开始尝试导出数据到:' + save_file_name)
with open("./" + save_file_name + ".txt", 'a', encoding='utf-8') as f:
row = len(export_file_arr) # 数组长度
out_txt = ''
for idx in range(row):
out_txt += str(idx) + ':' + export_file_arr[idx] + '\n'
f.write(out_txt)
print('导出成功!!文件名为:' + save_file_name)
exit() # 退出
tip:这个栗子是访问百度的众测平台,进行爬取每一页的说明标题和当前页面URL并保存在txt中,虽然有些小bug,不过咱是用着足够了。
说下原理:使用py打开Chrome浏览器,然后手动登录(避免爬虫伪造浏览器的复杂程度),登录之后,命令行输入y,程序定向到网页并开始不断循环控制刷新浏览器页面定向,之后从页面上找到对应信息保存到array中;最后保存循环这个数组就行了。