Python爬虫解决推广链接(跳转网页)的办法

        在初学爬虫的时候,我遇到了这样一个问题:我想以安兔兔手机跑分排行为引,对安卓高端机的部分数据进行爬取,但是后来发现安兔兔排行榜中提供的链接是京东的推广小链接,直接用爬虫request不到任何有价值的数据。

 像提供的链接是https://u.jd.com/yMQkt6R,但是点击去后网页url会发生变化,变成【努比亚红魔6S Pro】努比亚nubia腾讯红魔游戏手机6S Pro 18GB+512GB 氘锋透明版电竞5G手机165Hz屏幕刷新率骁龙888plus 120W快充【行情 报价 价格 评测】-京东


 而真正可以爬取的部分是在浏览器跳变后的url。

        那么,如何通过初始的推广链接获得京东的商品页面url呢?方法有很多,我这里提供一个比较简单的办法,通过selenium和webdriver控制浏览器,将推广链接发送给一个浏览器,然后让浏览器打开推广链接,之后浏览器内会自动进行网页的跳变,之后再将跳变后的url导出,就获得了商品页面的url。

废话不多上,上代码:


import requests
import re 
import json
from bs4 import BeautifulSoup
import webbrowser
import selenium
from selenium import webdriver
import time

url = ' https://www.antutu.com/ranking/rank1.htm'

headers = {
   
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
   }
r = requests.get(url,headers=headers)
r.encoding = "utf-8"
be = BeautifulSoup(r.text,features="lxml")

print(url)
C=be.select('ul[class="list-unstyled newrank-b"] a')
name=be.select('ul[class="list-unstyled newrank-b"] a div li[class="bfirst"]')

for a in range(0,4):
    
    
    phonename=re.findall(r'</span>(.*?)<span', str(name[a]), re.S)#手机名称
    #print(phonename)
    rankhref=C[a].get('href')
    #print(mobilehref)
    url1 = rankhref
    #webbrowser.get('chrome').open(url1,new=1,autoraise=True)
    driver = webdriver.Chrome()
    
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get(url1)
    time.sleep(0)
    url2=str(driver.current_url)
    phonehref=url2
    #print(driver.current_url)
    driver.quit()
    r1=requests.get(url2,headers=headers).text
    
    be1 = BeautifulSoup(r1,features="lxml")
    cpu= re.findall(r">CPU型号:(.*?)</li>", str(be1))
    ram= re.findall(r">运行内存:(.*?)</li>", str(be1))
    rom= re.findall(r">机身存储:(.*?)</li>", str(be1))
    item={
        '手机名称':phonename,
        'CPU型号':cpu,
        '运行内存':ram,
        '机身存储':rom,
        '详情':phonehref,
        
    }
    
    print(item)
    #print(cpu)
    #print(ram)
    #print(rom)
    
    a=a+1
print('over') 

运行结果:

 https://www.antutu.com/ranking/rank1.htm
{'手机名称': ['黑鲨游戏手机4S Pro'], 'CPU型号': ['其他'], '运行内存': ['其他'], '机身存储': ['其他'], '详情': 'https://item.jd.com/100014455777.html?cu=true&utm_source=kong&utm_medium=tuiguang&utm_campaign=t_1000762869_&utm_term=fd33e1b4a4674eb0a9b854dd2ebad540'}
{'手机名称': ['腾讯红魔游戏手机6S Pro'], 'CPU型号': ['骁龙888'], '运行内存': ['18GB'], '机身存储': ['512GB'], '详情': 'https://item.jd.com/100013727179.html?cu=true&utm_source=kong&utm_medium=tuiguang&utm_campaign=t_1000762869_&utm_term=9379bdc87c9b41099adc57b869b013a5'}
{'手机名称': ['iQOO 8 Pro'], 'CPU型号': ['骁龙888 Plus'], '运行内存': ['12GB'], '机身存储': ['256GB'], '详情': 'https://item.jd.com/100024540640.html?cu=true&utm_source=kong&utm_medium=tuiguang&utm_campaign=t_1000762869_&utm_term=dae82f896ac94e169a8ec1766f272a3d'}
{'手机名称': ['黑鲨游戏手机4 Pro'], 'CPU型号': ['骁龙888'], '运行内存': ['12GB'], '机身存储': ['256GB'], '详情': 'https://item.jd.com/100018568412.html?cu=true&utm_source=kong&utm_medium=tuiguang&utm_campaign=t_1000762869_&utm_term=7e83737247534c95b784bee7a9291881'}
over

核心解决办法便是:

driver = webdriver.Chrome()
    
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get(url1)
    time.sleep(0)
    url2=str(driver.current_url)
    phonehref=url2
    #print(driver.current_url)
    driver.quit()
    r1=requests.get(url2,headers=headers).text

这一部分中,通过打开浏览器,然后获得跳转后的url。

我也是新手学爬虫,这个办法有很多不完美之处,但是可以解决一时的问题,后续会找更好的办法,更多相关办法还请参考站内更多关于selenium爬取动态网页的办法。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值