selenium自动登录爬取网站数据

目标网站:古诗文网站
实现目标:自动化登录网站,并爬取指定页面的数据,并存储
用到的工具:selenium、百度手写数字识别

第一步:浏览网页

我们发现登录目标网站只需填写用户的信息,然后填写验证码既可以登录网站,明确需求以后我们开始操作
在这里插入图片描述

第二步:前期操作

我们可以用开发者工具定位账号和密码所在的位置,获取到他们的id信息,用selenium定位id,在用send_keys将信息填进去,为了更方便浏览网页,我们可以把窗口最大化,也就是使用maximize_window()

bro = webdriver.Chrome('./chromedriver.exe')
bro.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
bro.maximize_window()
# 填写id
bro.find_element_by_id('email').send_keys('你的账号')
# 填写密码
bro.find_element_by_id('pwd').send_keys('你的密码')

登录的关键在于获取验证码,之前我有尝试过直接把验证码图片爬取下来,但是到验证码读取之后登录网站时,发现当我在获取验证码图片的时候,对网站进行了二次请求,所以等到验证码识别之后,填写验证码的时候,出现验证码和图片上的码不相符的情况,所以这里我还是用截图抠图的方式来获取验证码图片。
对于图片的命名,我用了time函数来获取当前的时间来命名

picture_name2 = str(t) + '抠图.png'
bro.save_screenshot(picture_name2)

此时截的是整个页面的图像,后续我们在此基础上进行抠图
我们可以尝试定位验证码所在的位置,还是老办法使用selenium去定位id

address = bro.find_element_by_id('imgCode')
left = address.location['x']+370
top = address.location['y']+105
right = left + address.size['width']+18
height = top +address.size['height'] +12

后面加的参数是我自己手动试出来的,后面我会找一下怎么精准定位的方法
下面是抠图的代码

kt_img = jt_img.crop((left,top,right,height))
kt_img.save(picture_name2)

查看一下抠下来的图片长什么样子
在这里插入图片描述
我们能看到虽然字母很明显,但是还有有一些干扰因素,我们需要将这些干扰因素去除,或者降低干扰,所以我们需要对图片进行灰度处理

imgs = img.convert('L')
threshold = 127
filter_func = lambda x:0 if x<threshold else 1
image = imgs.point(filter_func,'1')

point函数是定义一个点函数,将点函数中的矩阵数据映射到0或者1,这样更方便记录矩阵信息,0代表白色,1代表黑色,超过预制参数就是黑色,用来退化我们不需要的那部分图像

处理后的图片
在这里插入图片描述
我们可以看到很明显,中间的验证码更清楚了

第三步:识别图片

我们读取图片之后,就可以用百度手写数字识别来识别图片了,关于百度手写数字识别,我们登录百度人工智能网站,具体操作可以看看别的文章介绍,我就不过多的介绍了

找到下列参数写入我们的代码当中
APP_ID =
APP_KEY =
SECRET_KEY =
然后我们就可以进行图像识别了

baidu_sip = AipOcr(APP_ID,APP_KEY,SECRET_KEY)
result = baidu_sip.handwriting(chuli_img)
print('验证码结果是:',result['words_result'][0]['words'])

result会给我们返回一个字典,这里我们只需要把验证码提取出来就可以了

第四步:填写验证码登录网站

定位到验证码填写框,填写我们刚获取到的验证码,再点击登录按钮,就实现了网页登录

V_code = result['words_result'][0]['words']
bro.find_element_by_id('code').send_keys(f'{V_code}')
bro.find_element_by_id('denglu').click()

第五步:爬取网站数据

这里我就不全站爬取了,有兴趣的朋友可以学习了crawlspider之后结合selenium进行全站爬取,后续会写相关文章,我们随便定位一个选项卡,我们爬取名句的第一页数据,具体代码如下,我就不过多解释了。

bro.find_element_by_xpath('//*[@id="html"]//div[1]/div[1]/div/div[2]/div[1]/a[2]').click()
# 爬取名句诗文
html = etree.HTML(res)
item = html.xpath('//*[@id="html"]//div[2]/div[1]/div[2]')
for i in item:
    shiwen = i.xpath('./div/a[1]/text()')
    zuozhe = i.xpath('./div/a[2]/text()')
    with open('./古诗文.csv','a',encoding='utf-8')as f:
        data = csv.writer(f)
        data.writerow(shiwen)
        data.writerow(zuozhe)

手写数字识别识别验证码是有一些误差的,不可能百分百的识别正确,但是准确率还是很高的

猜你喜欢

转载自blog.csdn.net/weixin_44052130/article/details/130683864