从登陆到爬取:Python反反爬获取某宝成千上万条公开商业数据

不知从何时起,开始享受上了爬取成千上万条数据的感觉!

本文将运用Python反反爬技术讲解如何获取某宝成千上万条公开商业数据。

目录

1 前期准备

2 案例详解 

2.1 导入模块

2.2 核心代码

2.3 总观代码

3 总结声明


1 前期准备

Python环境:Python 3.8.2

Python编译器:JetBrains PyCharm 2018.1.2 x64

第三方库及模块:selenium、time、csv、re

此外,还需要一个浏览器驱动器:webDriver

其中,selenium是一个第三方库,需要另外安装,就在终端输入下述命令行即可

pip install selenium

输入Python 和 import\, selenium 若未报错则证明第三方库安装成功。

 这里再说一下浏览器驱动器如何安装(以谷歌浏览器为例介绍):

首先,下载浏览器驱动器WebDriver

chrom浏览器的驱动器下载地址:http://npm.taobao.org/mirrors/chromedriver/

firefox(火狐浏览器)的驱动器下载地址:https://github.com/mozilla/geckodriver/releases

Edge浏览器的驱动器下载地址:https://developer.microsoft.com/en-us/micrsosft-edage/tools/webdriver

Safari浏览器的驱动器下载地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

以谷歌浏览器为例,需要首先知道浏览器的版本号

 只需要前面的83.0对应好就OK,大的方向对应了就行,然后找到相匹配的版本进行下载

 下载好以后测试一下

# 从 selenium 里面导入 webdriver
from selenium import webdriver

# 指定 chrom 驱动(下载到本地的浏览器驱动器,地址定位到它)
driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')

# get 方法打开指定网址
driver.get('http://www.baidu.com')

至此,准备工作就绪,接下来正式进入爬虫案例讲解

2 案例详解 

2.1 导入模块

将前文所述的第三方库及相关模块进行导入

from selenium.webdriver import ActionChains # 导入动作链
from selenium import webdriver
import time
import csv
import re

2.2 核心代码

确定目标网页:淘宝网(官网)

编写自动打开目标网页代码

# 传入浏览器驱动本地地址
driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')
# 传入目标页面地址
driver.get('https://www.taobao.com/')

最大化浏览器

driver.maximize_window() # 最大化浏览器

传入关键字并实现自动搜索商品

keyword = input('请输入您要搜索的商品名字:')
driver.find_element_by_id('q').send_keys(keyword)  # 根据“检查”的id值精确定位淘宝网搜索框并传入关键字
driver.find_element_by_class_name('btn-search').click() # 根据class标签'btn-search'定位到搜索按钮并点击

 这时我们发现,需要登录才能查看搜索内容,那么接下来解决登陆问题

传入账号密码(这里通过F12键定位其xpath值)

driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('账号')
driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('密码')

解决人机验证问题(反反爬,实现滑块向右滑动)

login = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') # 通过xpath找到滑块
action = ActionChains(driver)  # 创造出一个动作链
action.click_and_hold(on_element=login) # 点击不松开
action.move_by_offset(xoffset=300-42, yoffset=0) # 通过坐标轴滑动
action.pause(0.5).release().perform() # 设置链式调用时间(滑动滑块时间),并松开鼠标   perform()执行动作链

获取整个页面的目标数据值(for循环)

divs = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
for div in divs:
    info = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
    price = div.find_element_by_xpath('.//strong').text
    deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text
    shop = div.find_element_by_xpath('.//div[@class="shop"]/a').text

保存文件(以csv格式进行存储)

with open('data.csv', mode='a', newline="") as csvfile:
    csvWriter = csv.writer(csvfile, delimiter=',')
    csvWriter.writerow([info, price, deal, shop])

以上是爬取一页数据,那么爬取多页数据怎么撸代码呢

 获取总页数

page = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text # 获取总页数标签
page_list = re.findall('(\d+)', page)  # 正则表达式获取多个精确数字数据[返回的是列表]
page_num = page_list[0]   # 字符串类型数据

for循环遍历所有页面,获取该商品的所有数据

driver.get('https://s.taobao.com/search?q={}&s={}'.format(keyword, page_num*44))
page_num += 1

值得注意的是,上述代码的页面地址是根据查看多页地址数据获得规律总结出来的

很显然,从第2页数据地址开始,其s值从44\rightarrow 88\rightarrow 132\rightarrow,以数字44叠加规律生成。

2.3 总观代码

from selenium.webdriver import ActionChains # 导入动作链
from selenium import webdriver
import time
import csv
import re

# 寻找关键字并登录淘宝
def search_product(key):
    driver.get('https://www.taobao.com/')
    driver.find_element_by_id('q').send_keys(key)  # 根据“检查”的id值精确定位淘宝网搜索框并传入关键字
    driver.find_element_by_class_name('btn-search').click() # 根据class标签'btn-search'定位到搜索按钮并点击

    driver.implicitly_wait(10) # 隐式等待(单位是秒) 等到页面渲染完之后就不再等待
    driver.maximize_window() # 最大化浏览器

    # 解决登陆(登录防爬:例如有滑块)
    driver.find_element_by_xpath('//*[@id="fm-login-id"]').send_keys('这里填写账户名称/手机号码')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="fm-login-password"]').send_keys('这里填写账户密码')
    time.sleep(2)

    # 解决滑块
    login = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]') # 通过xpath找到滑块
    action = ActionChains(driver)  # 创造出一个动作链
    action.click_and_hold(on_element=login) # 点击不松开
    action.move_by_offset(xoffset=300-42, yoffset=0) # 通过坐标轴滑动
    action.pause(0.5).release().perform() # 设置链式调用时间(滑动滑块时间),并松开鼠标   perform()执行动作链
    driver.find_element_by_xpath('//*[@id="login-form"]/div[4]/button').click() # 点击登录并重定向到前面的关键字
    driver.implicitly_wait(10) # 隐式等待

    page = driver.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[1]').text # 获取总页数标签
    page_list = re.findall('(\d+)', page)  # 正则表达式获取多个精确数字数据[返回的是列表]
    page_num = page_list[0]   # 字符串类型数据

    return int(page_num)

# 爬取数据并保存
def get_data():
    divs = driver.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
    for div in divs:
        info = div.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
        price = div.find_element_by_xpath('.//strong').text
        deal = div.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        shop = div.find_element_by_xpath('.//div[@class="shop"]/a').text
        print(info, price, deal, shop, sep='|')

        # 保存
        with open('data.csv', mode='a', newline="") as csvfile:
            csvWriter = csv.writer(csvfile, delimiter=',')
            csvWriter.writerow([info, price, deal, shop])

def main():
    print('正在爬取第1页数据...')
    page = search_product(keyword)
    get_data()

    # 第2页之后数据获取
    page_num = 1   # page_num * 44
    while page_num != page:
        print('*' * 100)
        print('正在爬取第{}页数据'.format(page_num+1))
        print('*' * 100)
        driver.get('https://s.taobao.com/search?q={}&s={}'.format(keyword, page_num*44))
        driver.implicitly_wait(10)  # 隐式等待
        get_data()
        page_num += 1

    driver.quit()

if __name__ == '__main__':
    driver = webdriver.Chrome('E:/software/chromedriver_win32/chromedriver.exe')
    # keyword = '电脑'
    keyword = input('请输入您要搜索的商品名字:')
    main()

总运行效果截图展示

这是PyCharm运行效果截图

 这是csv文件打开后的截图

3 总结声明

最近在复习准备期末考试,7月份后我将系统写作爬虫专栏:Python网络数据爬取及分析「从入门到精通」
感兴趣的叫伙伴们可以先关注一波!

更多原创文章及分类专栏请点击此处→我的主页

★版权声明:本文为CSDN博主「荣仔!最靓的仔!」的原创文章,遵循CC 4.0 BY-SA版权协议。
                  转载请附上原文出处链接及本声明


欢迎留言,一起学习交流~~~

感谢阅读

END

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣仔!最靓的仔!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值