Python使用selenium爬取动态网页时遇到的问题

欢迎转载,转载请注明出处:https://blog.csdn.net/qq_41521792/article/details/83211527
我们在做京东手机信息的爬取时,遇到的一些问题,现在就来跟大家分享一下。

1.首先,京东的网页是动态的,当我们搜索一个商品时,需要把页面往下翻,下面的内容才会出来,这也是我们选selenium方法的原因

解决方法:让浏览器模拟下拉几次页面即可

from selenium import webdriver
import time
import random
url = 'https://www.jd.com'
browser.get(url)
#模拟搜索 手机 信息
shuru = browser.find_element_by_id('search').find_element_by_class_name('form').find_element_by_id('key')
shuru.send_keys('手机')
button = browser.find_element_by_id('search').find_element_by_class_name('form').find_element_by_class_name('button')
button.click()
#最大化窗口
browser.maximize_window()
#加载完网页所有内容
for i in range(9):
	#有些网站反爬虫很厉害,将下拉的高度设置成随机的,看起来更像人为的在操作
	browser.execute_script('window.scrollBy(0,{0})'.format(random.randint(600,900)),'') 
	time.sleep(1)

2.提取所有的li标签(问题来了)

我们要获取每件商品对应的详细页的网址,然后进去爬取详细数据
在这里插入图片描述

lis = browser.find_element_by_class_name('m-list').find_element_by_tag_name('ul').find_elements_by_tag_name('li')
#提取每个手机的详细页链接
for each in lis:
	href = each.find_elements_by_tag_name('a')[0].get_attribute('href')
	print(href) #输出每件商品详情页的网址

但是,我们会得到这样的结果
在这里插入图片描述
关于这个问题可以去https://www.cnblogs.com/cyjy/p/6182587.html 该博客查看
那么问题来了,明明链接就在那,用selenium自带的方法却提取不到,要怎么办呢,很简单,我们换一种提取方法

#空列表用来存储所有的li标签
lis = []
# 用beautifulsoup提取每个手机信息网址(从li中获取)
#page_source为当前网页的文本内容
soup = BeautifulSoup(browser.page_source, "html.parser") 
#存储当前网址
page = browser.current_url  #(注意!该处在提取下一页的时候会用到)
#存储所有li标签
lis.extend(soup.find('div', id="J_goodsList").find_all('li', class_='gl-item'))
for each in lis:
	#提取详细页的链接
	href = 'https:'+each.find('div', class_="p-img").find('a').attrs['href']
	#进入详细页提取信息
	browser.get(href)
	...
	

3.提取下一页

这一步方法有很多,当我们把鼠标放在"下一页"上时,会提示,“使用方向键右键可以翻到下一页”,所以我采用的是模拟按下键盘右键(ps:提取完当前页所有商品的详细信息时,网页停留在最后一个商品的详细页,我们需要回到商品列表页,这就需要用到前面保存的网址)

#回到商品列表页
browser.get(page)
#模拟按下键盘的右键
ActionChains(browser).send_keys(Keys.RIGHT).perform()
#释放按键
ActionChains(browser).send_keys(Keys.NULL)

到最后一页时怎么办呢,很简单,try-except

try:
	ActionChains(browser).key_down(Keys.CONTROL).send_keys(Keys.RIGHT).perform()
	ActionChains(browser).send_keys(Keys.NULL)
	time.sleep(1)
except:
	print("最后一页")

4.循环提取下一页

for i in range(1,101):
	#空列表用来存储所有的li标签
	lis = []
	# 用beautifulsoup提取每个手机信息网址(从li中获取)
	#page_source为当前网页的文本内容
	soup = BeautifulSoup(browser.page_source, "html.parser") 
	#存储当前网址
	page = browser.current_url  #(注意!该处在提取下一页的时候会用到)
	#存储所有li标签
	lis.extend(soup.find('div', id="J_goodsList").find_all('li', class_='gl-item'))
	for each in lis:
		#提取详细页的链接
		href = 'https:'+each.find('div', class_="p-img").find('a').attrs['href']
		#进入详细页提取信息
		browser.get(href)
		...
		try:
			ActionChains(browser).send_keys(Keys.RIGHT).perform()
			ActionChains(browser).send_keys(Keys.NULL)
			time.sleep(1)
		except:
			print("最后一页")

如果担心在运行中因为个别“特殊”商品导致程序终止,可以在外面再添加一个try

如果还有什么疑问欢迎留言
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值