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)

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 Selenium 自动爬取淘宝商品详情数据可以分为以下步骤: 1. 安装 Selenium 和浏览器驱动:SeleniumPython 中用于自动化 Web 浏览器的库,需要安装;同时需要下载对应浏览器的驱动程序,如 ChromeDriver。 2. 打开浏览器并访问淘宝网站:使用 Selenium 打开指定的浏览器并访问淘宝网站。 3. 搜索关键字并获取搜索结果:在搜索框中输入关键字并点击搜索按钮,等待搜索结果加载出来,使用 Selenium 获取搜索结果页面的 HTML 代码。 4. 解析搜索结果页面:使用 BeautifulSoup 解析搜索结果页面,获取每个商品的链接。 5. 进入商品详情页面并获取数据:遍历每个商品的链接,使用 Selenium 进入商品详情页面并获取需要的数据,如商品标题、价格、评论数、销量等。 6. 存储数据:将获取到的数据存储到数据库或文件中。 下面是一个示例代码: ```python from selenium import webdriver from bs4 import BeautifulSoup import time # 设置浏览器驱动路径 driver_path = './chromedriver.exe' # 创建浏览器对象 browser = webdriver.Chrome(driver_path) # 设置搜索关键字 keyword = '手机' # 访问淘宝网站 browser.get('https://www.taobao.com/') # 等待页面加载完成 time.sleep(3) # 找到搜索框并输入关键字 browser.find_element_by_name('q').send_keys(keyword) # 点击搜索按钮 browser.find_element_by_class_name('btn-search').click() # 等待搜索结果加载完成 time.sleep(5) # 获取搜索结果页面的 HTML 代码 html = browser.page_source # 使用 BeautifulSoup 解析搜索结果页面 soup = BeautifulSoup(html, 'html.parser') # 获取所有商品的链接 links = [] for item in soup.find_all('a', class_='J_ClickStat'): link = item.get('href') if link.startswith('https://'): links.append(link) # 遍历每个商品的链接并获取数据 for link in links: # 进入商品详情页面 browser.get(link) # 等待页面加载完成 time.sleep(3) # 获取商品标题 title = browser.find_element_by_xpath('//h3[@class="tb-main-title"]/text()') # 获取商品价格 price = browser.find_element_by_xpath('//div[@class="tb-property-cont"]/div[@class="tb-detail-price"]/span[@class="tb-price"]/text()') # 获取商品评论数 comment_count = browser.find_element_by_xpath('//div[@class="tb-rate-counter"]/span[@class="tm-count"]/text()') # 获取商品销量 sales_volume = browser.find_element_by_xpath('//div[@class="tb-sales-counter"]/span[@class="tm-count"]/text()') # 打印商品信息 print('标题:', title) print('价格:', price) print('评论数:', comment_count) print('销量:', sales_volume) # 关闭浏览器 browser.quit() ``` 需要注意的是,使用自动爬取数据容易被网站识别为机器行为,可以添加一些随机等待时间、请求头伪装等方式来降低被识别的概率。同时,爬取数据时也需要遵守网站爬虫规则,如不过度频繁访问、不采集敏感信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值