当前位置:   article > 正文

python-DrissonPage实现手爬淘宝网_python 爬虫 dri

python 爬虫 dri

推荐学习的网址:DrissionPage (gitee.io)icon-default.png?t=N7T8https://g1879.gitee.io/drissionpagedocs/

据某GPT搜索,淘宝的难度有以下:

  1. 反爬机制:淘宝网使用了一些反爬虫技术,如验证码、IP封锁、动态页面加载等。这些机制会使得爬取数据变得困难,因为你需要找到解决这些反爬措施的方法。

  2. 动态页面加载:淘宝网的页面通常采用了动态加载技术,也就是说,页面内容可能会通过JavaScript动态生成。这意味着你需要使用工具或库,如Selenium或PhantomJS来模拟浏览器行为并获取完整的页面内容。

  3. 数据结构和处理:淘宝网的页面结构复杂,数据分散在多个层级和标签中。你需要仔细分析页面结构,使用HTML解析库(如Beautiful Soup)来提取所需的数据。

  4. 登录和会话管理:如果你需要访问需要登录的页面或进行交互操作(如添加商品到购物车),你还需要处理登录和会话管理。这可能涉及到模拟用户登录、保存和管理会话Cookie等操作。

 但这一次我用的全新的方式,简单且粗暴,————一款全新的自动化框架DrissionPage 

DrissionPage概述:                

其中唯一的难点就是滑块验证,这就要涉及到opencv。在以后的教程中会详细的讲解。

我们从这个淘宝网 - 淘!我喜欢 (taobao.com)icon-default.png?t=N7T8https://login.taobao.com/member/login.jhtml网址走起,整个过程大家可以自己过一遍,而自动化就是一个模仿人的操作,如果大家尝试了各种点击,那么使用DrissionPage就是要完成这样一个操作。

1.登录页面

  1. def login(drission):
  2. # 定位账号文本框,并输入账号
  3. account_input = drission.ele('@id=fm-login-id').input('账号') # 定位密码文本框,并输入密码
  4. password_input = drission.ele('@id=fm-login-password').input('密码')
  5. if '向右滑动验证' in drission.html:
  6. login_huakuai()
  7. # 点击登录按钮
  8. login_button = drission.ele('@class =fm-button fm-submit password-login').click()
  9. time.sleep(2)
  10. return drission
'
运行

2.验证码登录

第一次登录,或者清楚了缓存,都会要验证码登录,之后可有可无

  1. def yanzhenam(drission):
  2. try:
  3. # 查找 iframe 元素
  4. drission.driver.switch_to.frame(iframe=drission.get_frame(1).html)
  5. # print(drission.html) #获取验证码
  6. drission.ele('@id=J_GetCode').click()
  7. drission.driver.waite.display()
  8. yzm = input('enter code:')
  9. drission.ele('@id=J_Phone_Checkcode').input(yzm)
  10. drission.ele('@id=submitBtn').click()
  11. time.sleep(3)
  12. except:
  13. return drission
'
运行

3.点击首页,点击手机

跳转到手机相关页面,这里演示的是爬取手机相关信息

  1. def gotoindex_and_phone(drission):
  2. try:
  3. drission.ele('xpath:/html/body/div[1]/div/ul[2]/li[1]/div/div/span').click()
  4. except:
  5. pass
  6. drission.driver.wait.display() # 等待直到出现
  7. drission.ele('xpath:/html/body/div[3]/div[1]/div/ul/li[5]/a[1]').click()
  8. drission.to_tab(drission.latest_tab) # 切换至最新的窗口
  9. return drission
'
运行

4.滑块验证

自动化爬取淘宝最难的地方就是滑块验证、点击验证,这里我只展示了滑块验证。其他验证后续发出

  1. def huakai():
  2. page = ChromiumPage()
  3. ac = ActionChains(page)
  4. while True:
  5. try:
  6. ac.hold('xpath:/html/body/div/div[2]/div/div[1]/div[2]/center/div[1]/div/div/div/span') # 抓住元素
  7. huakuai_size = drission.ele( # 获取滑块区域的长度
  8. 'xpath:/html/body/div/div[2]/div/div[1]/div[2]/center/div[1]/div/div/div').size[0]
  9. print(huakuai_size)
  10. lenth = huakuai_size / 3 # 求滑块的长
  11. print(lenth)
  12. lenth_ = [random.uniform(0, lenth) for i in range(3)] # 三次随机长度
  13. sum_ = sum(lenth_)
  14. for i in lenth_:
  15. ac.move(i, 0)
  16. ac.wait(random.uniform(0, 1.1))
  17. ac.move(lenth - sum_ + 1)
  18. time.sleep(5)
  19. if "error" in drission.html:
  20. drission.ele('xpath:/html/body/div/div[2]/div/div[1]/div[2]/center/div[1]/div/div/div').click()
  21. continue
  22. except:
  23. return
'
运行

5.连接数据库

根据自己需要爬取的字段,创库创表

  1. def init_sql():
  2. conn = pymysql.connect(host='localhost', port=3306, user='root', password='root')
  3. cur = conn.cursor()
  4. cur.execute('create database if not exists taobao1;')
  5. cur.execute('use taobao1;')
  6. cur.execute('drop table if exists T_label;') # 先删从表再删主表
  7. cur.execute('drop table if exists T_region;')
  8. cur.execute('drop table if exists T_phone;')
  9. cur.execute("""create table T_phone(id varchar(100) primary key,
  10. Title varchar(100) not null,
  11. Price varchar(100) not null,
  12. Number varchar(100) not null,
  13. business varchar(100) not null);""")
  14. cur.execute("""create table T_region(id int auto_increment primary key,
  15. city varchar(100) not null,
  16. region_id varchar(100) not null,
  17. foreign key(region_id) references T_phone(id));""")
  18. cur.execute("""create table T_label(id int auto_increment primary key,
  19. label varchar(100) not null,
  20. label_id varchar(100) not null,
  21. foreign key(label_id) references T_phone(id));""")
  22. return conn, cur
'
运行

6.爬取信息,保存至数据库

以下代码涉及到翻页、保存数据、元素定位、已经随机滑块验证。

  1. def get_tags(tags):
  2. tag = []
  3. for t in tags:
  4. tag.append(t.select_one('span').text)
  5. return tag
  6. def get_value(page, id):
  7. page.wait.load_start() # 等待页面进入加载状态
  8. drission.driver.waite.display()
  9. html = page.html # 获取源码
  10. req = BeautifulSoup(html, 'lxml') # 转成beautifulSOUp对象
  11. huakai() # 是否出现滑块
  12. drission.driver.waite.display() # 休眠
  13. time.sleep(1) # 休眠
  14. divs = req.select('div.Content--content--sgSCZ12 > div.Content--contentInner--QVTcU0M > div') # 最每一个手机的div
  15. # 获取每个div的内容
  16. for div in divs:
  17. # drission.driver.waite.display()
  18. # time.sleep(1)
  19. Title = re.sub('\s+', '', div.select_one(
  20. 'div > a > div > div.Card--mainPicAndDesc--wvcDXaK > div.Title--descWrapper--HqxzYq0 > div > span').get_text())
  21. print(Title)
  22. div1 = div.select_one(
  23. 'div > a > div > div.Card--mainPicAndDesc--wvcDXaK > div.Price--priceWrapper--Q0Dn7pN')
  24. Price = div1.select_one('.Price--unit--VNGKLAP').text + div1.select_one(
  25. '.Price--priceInt--ZlsSi_M').text + div1.select_one('.Price--priceFloat--h2RR0RK').text
  26. Number = div1.select_one('.Price--realSales--FhTZc7U').text
  27. print(Price)
  28. print(Number)
  29. div2 = div1.select('div')
  30. citys = get_tags(div2)
  31. print(citys)
  32. div3 = div.select('div > a > div > div.SalesPoint--subIconWrapper--s6vanNY > div')
  33. labels = get_tags(div3)
  34. print(labels)
  35. business = div.select_one(
  36. 'div > a > div > div.ShopInfo--shopInfo--ORFs6rK > div.ShopInfo--TextAndPic--yH0AZfx > a').text
  37. print(business)
  38. insert_sql(Title, Price, Number, citys, labels, business) # 每爬取一个就插入数据库
  39. print(id)
  40. next_page(page, id + 1)
  41. def next_page(page, id):
  42. try: # 点击下一页
  43. page.ele('@class=next-btn next-medium next-btn-normal next-pagination-item next-next').click()
  44. # page.wait.load_start() # 等待页面进入加载状态
  45. if page is not None:
  46. get_value(page, id)
  47. except:
  48. return None
  49. # 数据库
  50. def get_id():
  51. id = ''.join([random.choice(string.digits + string.ascii_letters) for i in range(10)])
  52. return id
'
运行

7.关闭数据库

  1. def close_sql():
  2. cur.close()
  3. conn.close()
'
运行

8.调用整个函数

  1. if __name__ == '__main__':
  2. # 创建页面对象,并启动或接管浏览器
  3. # 设置Edge浏览器的路径
  4. set_paths(browser_path=r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe')
  5. # 创建Drission对象,并指定浏览器名称为"edge"
  6. drission = WebPage()
  7. # 打开淘宝登录页面
  8. drission.get('https://login.taobao.com/member/login.jhtml')
  9. drission = login(drission) # 登录函数
  10. drission = yanzhenam(drission) # 验证码登录
  11. drission = gotoindex_and_phone(drission) # 去到首页和点击手机
  12. huakai() # 滑块验证
  13. conn, cur = init_sql() # 初始化数据库
  14. print('数据库创建完成')
  15. get_value(drission, 1)
  16. close_sql() # 关闭数据库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/909956
推荐阅读
相关标签
  

闽ICP备14008679号