python爬取动态网页时,使用requests库就无法获取到在网页上动态加载的数据,举个例子,以淘宝为例,在搜索栏上搜索电脑,出现的所有商品信息都为动态加载的数据,
import requests
head = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
url = 'https://ai.taobao.com/search/index.htm?spm=a231o.13503973.search.1&key=%E7%94%B5%E8%84%91'
data = requests.get(url=url,headers=head)#利用get进行请求
data.encoding=data.apparent_encoding#设置编码格式
content = data.text#将对网站访问的信息保存在content变量中
print(content)
我们在打印出来的content中搜索不到商品的任何信息
但是在网页的代码中数据又确实存在
那现在怎么办呢??我们用浏览器打开页面是可以看到信息的,但是用requests去请求网页就请求不到数据
其实也很简单,我们采用真实浏览器访问页面,再将它的源代码取下来,对此时的源代码进行爬取就可以了,所以现在问题就是如何用代码进行真实的浏览器访问
接下来引入seleiunm的概念,它是一个web应用的测试工具,能够驱动浏览器对页面进行访问
一般来说,seleiunm要与一个浏览器的驱动程序一起使用
谷歌浏览器的驱动程序叫ChromeDriver,火狐浏览器的驱动叫GeckoDriver,读者自行百度安装下载,也可以在优快云上找到驱动的安装方法
小编使用的是火狐浏览器
我们不使用requests,需要从头将代码换一下
from selenium import webdriver
browser = webdriver.Firefox(executable_path=r'D:\python\python安装\Scripts\geckodriver.exe')#实例化一个驱动对象
browser.get('https://uland.taobao.com/sem/tbsearch?&keyword=电脑&pnum=0')#利用浏览器驱动访问淘宝搜索 电脑第一页
data = browser.page_source#获取页面的源代码
print(data)
此时的data为网页的真实源代码,我们试试搜一下商品信息
发现,此时代码获得的信息中,是可以爬取到商品信息的
加下来就使用正则表达式,对获取的信息进行筛选,过滤出我们需要的信息
根据小编的总结
商品名称的匹配规则为
p_name = '<span class="title-text">(.*?)</span>'
商品现价格的匹配规则为
p_price = '<span class="coupon-price-afterCoupon">(.*?)</span>'
商品原价格的匹配规则为
p_price_old = '<span class="coupon-price-old">(.*?)</span>'
商品店家的匹配规则为
p_store = '<span class="atbfont seller-icon"></span>(.*?)</div>'
商品月销量的匹配规则为
p_sale = '<div class="sell-info">月销 (.*?)</div>'
以商品名称为例,我们做一个示范
p_name = '<span class="title-text">(.*?)</span>'
namelist = re.findall(p_name, data)
print(namelist)
运行后出现的结果
可以看到现在就将淘宝的商品名称爬取出来了,其实也很简单
商品的价格、店家、月销量等信息可以通过此类方法进行获取,这里就不一一演示了
最后将完整的代码分享给大家,大家不要机械地复制粘贴,要将代码改为适合自己电脑的,下面的代码适用于小编的电脑,在其他电脑上,可能需要将浏览器驱动程序的路径(第七行)等 改为自己电脑的方可运行
import re
from selenium import webdriver
dataset = {'商品名称':[],'商品价格':[],'原价':[],'店铺':[],'月销':[]}
name = input('请输入商品名称:')
page = input('请输入获取淘宝数据页数:')
num = int(page)
browser = webdriver.Firefox(executable_path=r'D:\python\python安装\Scripts\geckodriver.exe')
p_name = '<span class="title-text">(.*?)</span>'
p_price = '<span class="coupon-price-afterCoupon">(.*?)</span>'
p_price_old = '<span class="coupon-price-old">(.*?)</span>'
p_store = '<span class="atbfont seller-icon"></span>(.*?)</div>'
p_sale = '<div class="sell-info">月销 (.*?)</div>'
for i in range(0,num):
browser.get('https://uland.taobao.com/sem/tbsearch?&keyword={}&pnum={}'.format(name,i))
data = browser.page_source
namelist = re.findall(p_name, data)
for i in namelist:
dataset['商品名称'].append(i)
pricelist = re.findall(p_price, data)
for i in pricelist:
dataset['商品价格'].append(i)
price_oldlist = re.findall(p_price_old, data)
for i in price_oldlist:
i = i.replace('¥', '')
dataset['原价'].append(i)
store = re.findall(p_store, data)
for i in store:
dataset['店铺'].append(i)
sale = re.findall(p_sale, data)
for i in sale:
dataset['月销'].append(i)
browser.quit()
print('共计{}件商品'.format(len(dataset['商品名称'])))
import xlwings as xw
app = xw.App(visible=False,add_book=False)
print('正在生成excel表格...(共5列)')
work_book = app.books.add()
work_sheet = work_book.sheets.add('淘宝{}前{}页数据'.format(name,num))
work_sheet['A1'].value = '商品名称'
work_sheet['B1'].value = '现价'
work_sheet['C1'].value = '原价'
work_sheet['D1'].value = '店铺'
work_sheet['E1'].value = '月销量'
for i,j in zip(dataset.keys(),range(1,6)):
for k in range(2,num * 60):
cell = '{}{}'.format(chr(64+j),k)
work_sheet[cell].value = dataset[i][k-2]
print('第{}列已完成'.format(j))
work_sheet.autofit()
work_book.save(r'C:\Users\yzb\Desktop\淘宝{}数据.xlsx'.format(name))
work_book.close()
app.quit()
print('程序运行结束')
接下来我们看看代码的实际效果
python爬虫某宝