Selenium爬取淘宝数据
程序员文章站
2022-04-26 15:40:51
...
使用Selenium抓取淘宝数据
淘宝的反扒措施太严格了。搞了半天没**,最后使用使用所见即可爬的Selenium。
在正常浏览器打开淘宝在console面板输入window.navigator.webdriver,返回的时undefined,使用selenium驱动的浏览器同样的操作,返回的是True。可能是淘宝的反扒措施之一。
尝试了淘宝的登录页面,但是没有获取到“密码登录”的接口。
所以直接在程序运行过程中扫码登录。
定义一个登录方法login():
def login():
logon_url = "https://login.taobao.com/"
browser.get(logon_url)
try:
print("请扫码登录")
time.sleep(10)
# until()方法传入等待条件,presence_of_element_located()代表节点出现,其参数为节点的定位元祖。
input = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@id="q"]')))
submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@class="btn-search tb-bg"]')))
input.clear()
input.send_keys(KEYWORD)
submit.click()
time.sleep(2)
print("登录成功")
except Exception as e :
print("登录失败",e)
login方法的input ,submit 为搜索框和确定搜索按钮,获取到搜索框后往搜索框里输入文字(KEYWORD)即我们想要搜索的关键字,然后点击搜索按钮。
定义抓取商品信息的方法
def get_products(html):
"""
抓取商品信息
:return:
"""
doc = pq(html)
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
product = {
'image': item.find('.pic .img').attr('data-src'),
'price': item.find('.price').text(),
'deal': item.find('.deal-cnt').text(),
'title': item.find('.title').text(),
'shop': item.find('.shop').text(),
'location': item.find('.location').text()
}
这个方法里定义商品字段。接受的参数为html,即浏览器当前所在的页面。
定义一个循环逻辑的方法
def index_page():
# 循环页数
for i in range(2,11):
html = browser.page_source
get_products(html)
print("正在翻页-------------")
# 获取数字框,往里面写入数字,然后点击确定
input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')))
input.clear()
input.send_keys(i)
# 确定按钮
next = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[@class="btn J_Submit"]')))
next.click()
print("翻页完成")
time.sleep(3)
print("请求完成!")
这个方法的input ,next 为翻页数字框与确定按钮。
获取到这个数字框,然后点击确定实现翻页操作。翻页之后将html代码作为参数传递给get_products()。
最后定义一个写入数据库的方法。
即可完成整个抓取过程。
完整代码如下:
# coding : utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import time
import pymysql
browser = webdriver.Chrome()
# 显示等待,指定最长等待时间
wait = WebDriverWait(browser, 10)
# 搜索关键字
KEYWORD = 'IPAD'
conn = pymysql.connect(
host="localhost",
database="test",
user="root",
password="root",
port=3306,
charset='utf8'
)
cursor = conn.cursor()
def login():
logon_url = "https://login.taobao.com/"
browser.get(logon_url)
try:
print("请扫码登录")
time.sleep(10)
# until()方法传入等待条件,presence_of_element_located()代表节点出现,其参数为节点的定位元祖。
input = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@id="q"]')))
submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@class="btn-search tb-bg"]')))
input.clear()
input.send_keys(KEYWORD)
submit.click()
time.sleep(2)
print("登录成功")
except Exception as e :
print("登录失败",e)
def index_page():
# 循环页数
for i in range(2,11):
html = browser.page_source
get_products(html)
print("正在翻页-------------")
# 获取数字框,往里面写入数字,然后点击确定
input = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')))
input.clear()
input.send_keys(i)
# 确定按钮
next = wait.until(EC.element_to_be_clickable((By.XPATH, '//span[@class="btn J_Submit"]')))
next.click()
print("翻页完成")
time.sleep(3)
print("请求完成!")
def get_products(html):
"""
抓取商品信息
:return:
"""
doc = pq(html)
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
product = {
'image': item.find('.pic .img').attr('data-src'),
'price': item.find('.price').text(),
'deal': item.find('.deal-cnt').text(),
'title': item.find('.title').text(),
'shop': item.find('.shop').text(),
'location': item.find('.location').text()
}
write(product)
print("写入一条数据")
def write(info):
sql = "insert into taobao_ipad (image,price,deal,title,shop,location)values (%s,%s,%s,%s,%s,%s);"
cursor.execute(sql,(info["image"],info["price"],info["deal"],info["title"],info["shop"],info["location"]))
def main():
login()
index_page()
if __name__ == "__main__":
main()
conn.commit()
数据库显示如下:
抓取成功。变换关键字即可抓取不同的商品。
上一篇: spring Security安全框架
下一篇: Python爬取淘宝图片