欢迎转载,转载请注明出处: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