对淘宝商品的信息进行提取,首先导入需要的模块,基本都是使用的下面的几个模块:
from selenium import webdriver # 基本的模块
from selenium.common.exceptions import TimeoutException # 超时报错
from selenium.webdriver.common.by import By # 基本的元素查找
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait # 设置等待时间,超出时间就会触发 超时报错
from urllib.parse import quote # 将中文转码为url地址
from pyquery import PyQuery # 数据解析模块
鳄鱼君Ba这里使用pyquery来解析数据,当然你也可以使用其它的解析模块。然后我么这里以女装作为演示。
KEYWORD='女装'
browser=webdriver.Chrome('驱动器路径') # 我直接放在了python.exe目录下,所以可以不写路径
wait= WebDriverWait(browser,10) # 设置超时等待时间
基本上所有的网站,都会有滑动验证码,如果你通过selenium自动输入用户名和密码登录,它会认为你就是一个机器人,所以肯定会出现验证码。对于滑动验证,selenium实现起来比较麻烦,代码也不易理解,更好的办法就是通过Cookie,方便又简单!
获取cookie的方法很多,可以通过selenium自带的get_cookies()来获取,也可以通过requests模块,携带登录参数登录并获取到cookie,当然你也可以通过手动复制登录过后的cookie。这里复制的cookie是请求头中的Cookie,需要进行cookie替换:
str='浏览器请求头中复制的cookie '
str.replace('"','') #替换"为空,这个没用上
str_list=str.split(';') #通过;分割为列表list
cookie_list=[]
for item in str_list: #通过循环取出元素
name_value={}
name_value['name']=item.split('=')[0].strip()
name_value['value']=item.split('=')[1]
cookie_list.append(name_value) #添加到我们的cookie_list
print(cookie_list)#输出,一行排版可以换行
selenium携带的cookie格式为字典类型,每个字典必须有name和value两个键:{name:’ ‘,value:’ ‘} ,就是这种字典格式,当然不仅仅只有这两个。可以使用以上脚本进行转换,然后通过循环添加即可!
鳄鱼君Ba在这里,准备通过手动扫码登录,然后保存cookie到本地,下次登录直接从本地获取cookie登录。这种方式只需要扫码一次即可,相比于复杂的滑动验证码来说,再简单不过了!获取cookie代码参考:
def get_cookie():
login_url='https://login.taobao.com/member/login.jhtml'
browser=webdriver.Chrome()
browser.maximize_window() # 最大化浏览器窗口
browser.get(login_url)
time.sleep(15)
dic_cookie=browser.get_cookies()
str_cookie=json.dumps(dic_cookie)
dic_cookie=re.sub('"expiry":.*?,','',str_cookie) # 剔除过期时间的属性
with open('./tao_bao_cookie.txt','w',encoding='utf-8') as f:
f.write(dic_cookie)
get_cookie()
如果cookie中存在expiry,必须要替换掉,这个是设置cookie到期时间的。运行代码,我们使用扫码登录之后,就可以将cookie保存到本地,下次可以直接读取。淘宝的cookie的过期时间大约几个小时,几个小时过后还需要重新扫码登录获取cookie
接下来从文件中读取cookie,先打开淘宝首页,然后携带cookie打开我们搜索的页面:
def add_cookie():
browser=webdriver.Chrome()
browser.maximize_window() # 最大化浏览器窗口
browser.get('https://www.taobao.com/')
with open('./tao_bao_cookie.txt','r',encoding='utf-8') as f:
tao_cookie=json.loads(f.read())
for item in tao_cookie:
browser.add_cookie(item)
KEYWORD='女装'
url='https://s.taobao.com/search?q='+quote(KEYWORD)
browser.execute_script('window.open()') # 采用js打开新的标签页
browser.switch_to.window(browser.window_handles[1]) # 切换到第二个标签页
browser.get(url)
print(browser.page_source)
add_cookie()
如果报错:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain,就是你先添加cookie,然后再打开url,不能这样做!代码中是先打开淘宝首页,然后读取cookie并添加,打开新的标签窗口就会显示登录后的页面,最后打印一下网页的源码,基本可以得到数据,接下来是信息的提取。
先明确一点,获取page_source之后需要进行数据解析。这里你需要在selenium打开的淘宝中进行数据的查询提取,不要在浏览器中的淘宝页面进行数据的查询提取,两者是有区别的,淘宝设置了反爬,两者的源代码不同!
翻页需要在当前页面进行,而不要重新打开标签窗口,翻页频率不宜过快,会弹出滑动验证码,这个滑动验证码就会终结你的程序!无论你如何滑动都不会成功的
修改add_cookie函数:
def add_cookie(page):
browser=webdriver.Chrome()
browser.maximize_window() # 最大化浏览器窗口
wait=WebDriverWait(browser,10)
browser.get('https://www.taobao.com/')
with open('./tao_bao_cookie.txt','r',encoding='utf-8') as f:
tao_cookie=json.loads(f.read())
for item in tao_cookie:
browser.add_cookie(item)
KEYWORD='女装'
url='https://s.taobao.com/search?q='+quote(KEYWORD)
browser.execute_script('window.open()') # 采用js打开新的标签页
browser.switch_to.window(browser.window_handles[1]) # 切换到第二个标签页
browser.get(url)
with open('tao.html', 'w', encoding='utf-8') as f:
f.write(browser.page_source)
# 翻页
for i in range(int(page)):
if i > 1:
# 页码输入框
try:
page_box = wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')
)
)
# 页码点击框
page_bottom = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')
)
)
page_box.clear() # 清空页码输入框
page_box.send_keys(str(i)) # 发送页码
page_bottom.click() # 点击确定按钮
time.sleep(20) # 翻页等待
except TimeoutException as e:
pass
#等待一定的时间(时间为wait的时间),直到通过css选择器能在页面找到某个元素,如果超时还没有找到就继续向后执行
wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')
)
)
html = browser.page_source # 获取网页的源码
parse_data(html)
def parse_data(html):
doc = PyQuery(html)
data = {} # 创建一个字典用于存储数据
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
data['img'] = 'http:' + re.sub('_230x230.jpg', '', item.find('.pic .img').attr('data-src')) # 替换掉图片尺寸
data['price'] = item.find('.price').text()
data['title'] = item.find('.title').text()
data['people'] = item.find('.deal-cnt').text()
data['shop'] = item.find('.shop').text()
with open('./tao_tao_data.json','w',encoding='utf-8') as f:
f.write(json.dumps(data)+'\n')
if __name__ == '__main__':
html=add_cookie(100)
也可以存储到mongodb中:
from pymongo import MongoClient
def save_to_mongo(data):
client=MongoClient('127.0.0.1',port=27017)
database=client.TaoBao #创建数据库
collection=database.taobao # 数据库集合名字
collection.insert_one(data)
print('存储到mongo数据库成功')
到此就实现了淘宝商品信息的抓取,这里只是存储为json文件,也可以存储为其他格式。cookie过5个小时左右就会过去,这个只能重新扫码获取了。现在还有一个棘手的问题,就是翻页频繁会出现滑动验证码,手动也好自动也好,都会出现滑块验证失败的!所以你需要设置合适的时间延时,或者更换代理,这里不过多介绍!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!