B/J爬虫分析
概要
-
百度自动登录
-
爬取京东商品数据
-
知乎登录防爬措施

详情
-
百度自动登录
1、用户名密码登录
from selenium import webdriver import time # 1.指定操作的浏览器驱动(谷歌) bro = webdriver.Chrome() # 2.控制浏览器访问网站 bro.get('https://www.baidu.com') # 3.获取登录链接标签 loginTag = bro.find_element_by_id('s-top-loginbtn') # 4.点击登录链接 loginTag.click() # 5.一般弹出窗口都是悬浮窗口 # 该页面登录框不是由悬浮窗口构成,这里直接查找即可 # bro.switch_to.frame('iframeResult') '''延迟等待:页面数据有时候需要时间加载 但是代码不会自动等''' time.sleep(3) # 6.获取用户名以及密码输入框 userName = bro.find_element_by_id('TANGRAM__PSP_11__userName') password = bro.find_element_by_id('TANGRAM__PSP_11__password') # 7.书写用户名和密码 userName.send_keys('正确的用户名') password.send_keys('正确的密码') # 8.获取登录按钮 loginBtn = bro.find_element_by_id('TANGRAM__PSP_11__submit') # 9.点击登录按钮 loginBtn.click() # 10.延迟并关闭 time.sleep(15) bro.close()
2、短信登录
from selenium import webdriver import time # 1.使用谷歌浏览器访问百度首页 bro = webdriver.Chrome() bro.get('https://www.baidu.com/') # 2.查找页面上的登录按钮 login_tag = bro.find_element_by_id('s-top-loginbtn') # 3.点击登录按钮 time.sleep(0.5) login_tag.click() time.sleep(3) # 4.查找点击短信登录按钮 message_tag = bro.find_element_by_id('TANGRAM__PSP_11__changeSmsCodeItem') message_tag.click() time.sleep(0.5) # 5.查找手机号输入框并填写内容 phone_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsPhone') phone_tag.send_keys(18818188888) time.sleep(0.5) # 6.查找发送验证码按钮并点击 btn_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsTimer') btn_tag.click() time.sleep(0.5) # 7.查找并点击登录按钮 submit_tag = bro.find_element_by_id('TANGRAM__PSP_11__smsSubmit') submit_tag.click() time.sleep(0.5) # 8.关闭浏览器 bro.close()
延时等待
访问百度时在登录框弹出前就查找按钮会因为找不到而报错, 各种网站的加载都需要时间,导致代码容易报错。此时我们需要在等待页面数据加载完毕后继续执行代码,可以加入以下语句。
# 加在指定浏览器驱动的语句后 bro.implicitly_wait(10)

注意点
1.商品数据的展示页存在动态加载的情况 需要往下滚动 # 当前页面屏幕高度 window.document.body.scrollHeight # 滚动到指定位置 window.scrollTo 2.针对图片数据存在懒加载现象 3.多页数据的爬取 由于我们使用的是selenuim所以此处只需要查找下一页按钮点击即可 将单页爬取数据的代码封装成一个函数 之后就可以循环爬取多页 4.数据的持久化(保存)
完整代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys import time # 0.指定谷歌浏览驱动 bro = webdriver.Chrome() # 1.访问京东首页 bro.get('https://www.jd.com/') bro.implicitly_wait(10) # 延时等待 # 2.查找搜索款并输入商品名称 search_input = bro.find_element_by_id('key') search_input.send_keys('高达') # 3.按下enter键进入商品展示页 search_input.send_keys(Keys.ENTER) # 由于数据存在滚动加载的现象 for i in range(0, 8000, 1000): # 千万不能直接到底 一定要有一个波段 bro.execute_script('window.scrollTo(0,%s)' % i) time.sleep(0.5) good_list = bro.find_elements_by_css_selector('li.gl-item') # 循环获取每一个li标签 筛选所需数据 for li in good_list: # 图标标签的src属性 img_tag = li.find_element_by_css_selector('div.p-img a img') img_src = img_tag.get_attribute('src') '''img标签的src属性存在懒加载现象 src没有就在data-lazy-img属性下''' if not img_src: img_src = 'https:' + img_tag.get_attribute('data-lazy-img') # 商品价格 price_tag = li.find_element_by_css_selector('div.p-price strong') order_price = price_tag.text # 商品描述 desc_tag = li.find_element_by_css_selector('div.p-name a em') order_desc = desc_tag.text # 商品链接 link_tag = li.find_element_by_css_selector('div.p-name a') order_link = link_tag.get_attribute('href') # 商品销量 commit_tag = li.find_element_by_css_selector('div.p-commit strong a') order_commit = commit_tag.text # 店铺名称 shop_tag = li.find_element_by_css_selector('div.p-shop span a') shop_name = shop_tag.text # 店铺链接 shop_link = shop_tag.get_attribute('href') # 通过打印展示数据 也可以数据持久化到表格文件 print(""" 商品描述:%s 商品价格:%s 商品图片:%s 商品链接:%s 店铺名称:%s 店铺链接:%s """ % (order_desc, order_price, img_src, order_link, shop_name, shop_link)) # 关闭浏览器 bro.close()

-
知乎登录防爬措施
1.电脑端知乎不登陆是无法直接访问首页的 2.network监控发送登录请求体数据为加密 加密的代码关键字:encrypt 解密的代码关键字:decrypt 3.搜索关键字encrypt通过断点调试查看到加密数据 4.运行解密相关JS代码,分析数据 5.获取真实的请求体数据,发送请求获取数据


浙公网安备 33010602011771号