爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

2024-02-17 02:12

本文主要是介绍爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先淘宝需要登录,这一点如果用selenium如何解决,只能手动登录?如果不用selenium,用cookies登录也可。但是验证码又是一个问题,现在的验证码五花八门,难以处理。

我们回到正题,假设你已经登录上淘宝了,接着我们需要找到输入框和搜索按钮,输入“手机”,点击搜索即可,如何找到对应的元素呢?
在这里插入图片描述
接着来到搜索得到的页面,首先找到父类容器的位置。


items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()

这行代码是使用Python的pyquery库来解析HTML并提取特定元素。代码是在doc(一个pyquery对象)中查找符合特定CSS选择器的元素。
这个CSS选择器匹配一个具有特定类名的div元素,该元素是另一个具有特定类名的div元素的直接子元素,以此类推。>符号表示“直接子元素”。
.items()方法是获取所有匹配的元素,并返回一个生成器,可以用于迭代每个匹配的元素。
在这里插入图片描述
接着运用找输入框和搜索按钮的方法找到你想要爬取内容的位置,下面展示其中一个的例子
在这里插入图片描述


title = item.find('.Title--title--jCOPvpf span').text()

这行代码是使用Python的BeautifulSoup库来解析HTML并提取特定元素的文本内容。
item.find(‘.Title–title–jCOPvpf span’)是在item(一个BeautifulSoup对象)中查找具有类名Title–title–jCOPvpf的元素,并且这个元素下的span子元素。

接着找到下一页的按钮,完成翻页的操作!
在这里插入图片描述
最后创建数据库,将数据插入即可。


# 删除同名的旧表
drop_table_sql = "DROP TABLE IF EXISTS {}".format(MYSQL_TABLE)
cursor.execute(drop_table_sql)# 创建新表的SQL语句
create_table_sql = """
CREATE TABLE {} (price VARCHAR(255),deal VARCHAR(255),title VARCHAR(255),shop VARCHAR(255),location VARCHAR(255),postFree VARCHAR(255)
)
""".format(MYSQL_TABLE)# 执行SQL语句
cursor.execute(create_table_sql)

最后的结果如下(使用Navicat Premium可视化):
在这里插入图片描述
这次共爬取4800件商品。

完整代码如下所示:


import pymysql
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import time
import random# 要搜索的商品的关键词
KEYWORD = '手机'
# 数据库中要插入的表
MYSQL_TABLE = 'phone'# MySQL 数据库连接配置,根据自己的本地数据库修改
db_config = {'host': 'localhost','port': 3306,'user': 'root','password': '123456','database': 'myh','charset': 'utf8mb4',
}# 创建 MySQL 连接对象
conn = pymysql.connect(**db_config)
cursor = conn.cursor()# 删除同名的旧表(如果存在)
drop_table_sql = "DROP TABLE IF EXISTS {}".format(MYSQL_TABLE)
cursor.execute(drop_table_sql)# 创建新表的SQL语句
create_table_sql = """
CREATE TABLE {} (price VARCHAR(255),deal VARCHAR(255),title VARCHAR(255),shop VARCHAR(255),location VARCHAR(255),postFree VARCHAR(255)
)
""".format(MYSQL_TABLE)# 执行SQL语句
cursor.execute(create_table_sql)# 提交事务
conn.commit()options = webdriver.ChromeOptions()
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
options.add_experimental_option("excludeSwitches", ['enable-automation'])# 把chrome设为selenium驱动的浏览器代理;
driver = webdriver.Chrome(options=options)
# 窗口最大化
driver.maximize_window()# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是15秒)。
# 如果一直到等待时间都没满足则会捕获TimeoutException异常
wait = WebDriverWait(driver, 15)# 打开页面后会强制停止10秒,请在此时手动扫码登陆
def search_goods(start_page, total_pages):print('正在搜索: ')try:driver.get('https://www.taobao.com')# 强制停止10秒,请在此时手动扫码登陆time.sleep(10)driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})# 找到搜索输入框input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))# 找到“搜索”按钮submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))input.send_keys(KEYWORD)submit.click()# 搜索商品后会再强制停止10秒,如有滑块请手动操作time.sleep(10)# 如果不是从第一页开始爬取,就滑动到底部输入页面然后跳转if start_page != 1 :# 滑动到页面底端driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滑动到底部后停留1-3srandom_sleep(1, 3)# 找到输入页面的表单pageInput = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/span[3]/input')))pageInput.send_keys(start_page)# 找到页面跳转的确定按钮,并且点击admit = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[3]')))admit.click()get_goods()for i in range(start_page + 1, start_page + total_pages):page_turning(i)except TimeoutException:print("search_goods: error")return search_goods()
# 进行翻页处理
def page_turning(page_number):print('正在翻页: ', page_number)try:# 找到下一页的按钮submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]')))submit.click()# 判断页数是否相等wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/span/em'), str(page_number)))get_goods()except TimeoutException:page_turning(page_number)
#获取每一页的商品信息;
def get_goods():# 获取商品前固定等待2-4秒random_sleep(2, 4)html = driver.page_sourcedoc = pq(html)# 提取所有商品的共同父元素的类选择器items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()for item in items:# 定位商品标题title = item.find('.Title--title--jCOPvpf span').text()# 定位价格price_int = item.find('.Price--priceInt--ZlsSi_M').text()price_float = item.find('.Price--priceFloat--h2RR0RK').text()if price_int and price_float:price = float(f"{price_int}{price_float}")else:price = 0.0# 定位交易量deal = item.find('.Price--realSales--FhTZc7U').text()# 定位所在地信息location = item.find('.Price--procity--_7Vt3mX').text()# 定位店名shop = item.find('.ShopInfo--TextAndPic--yH0AZfx a').text()# 定位包邮的位置postText = item.find('.SalesPoint--subIconWrapper--s6vanNY span').text()result = 1 if "包邮" in postText else 0# 构建商品信息字典product = {'title': title,'price': price,'deal': deal,'location': location,'shop': shop,'isPostFree': result}save_to_mysql(product)
# 在 save_to_mysql 函数中保存数据到 MySQL
def save_to_mysql(result):try:sql = "INSERT INTO {} (price, deal, title, shop, location, postFree) VALUES (%s, %s, %s, %s, %s, %s)".format(MYSQL_TABLE)print("sql语句为:  "  + sql)cursor.execute(sql, (result['price'], result['deal'], result['title'], result['shop'], result['location'], result['isPostFree']))conn.commit()print('存储到MySQL成功: ', result)except Exception as e:print('存储到MYsql出错: ', result, e)
# 强制等待的方法,在timeS到timeE的时间之间随机等待
def random_sleep(timeS, timeE):# 生成一个S到E之间的随机等待时间random_sleep_time = random.uniform(timeS, timeE)time.sleep(random_sleep_time)
# 在 main 函数开始时连接数据库
def main():try:pageStart = int(input("输入您想开始爬取的页面数: "))pageAll = int(input("输入您想爬取的总页面数: "))search_goods(pageStart, pageAll)except Exception as e:print('main函数报错: ', e)finally:cursor.close()conn.close()#启动爬虫
if __name__ == '__main__':main()

请大家关注一下我的公众号。
在这里插入图片描述

这篇关于爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716378

相关文章

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

cell phone teardown 手机拆卸

tweezer 镊子 screwdriver 螺丝刀 opening tool 开口工具 repair 修理 battery 电池 rear panel 后盖 front and rear cameras 前后摄像头 volume button board 音量键线路板 headphone jack 耳机孔 a cracked screen 破裂屏 otherwise non-functiona

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

想要从OPPO手机恢复数据?免费OPPO照片视频恢复软件

此实用程序可帮助那些寻找以下内容的用户: 在OPPO手机中格式化存储卡后可以恢复图片吗?我删除了 OPPO上的视频和图片,我感觉很糟糕,因为里面有我在拉斯维加斯拍摄的视频和照片 免费OPPO照片视频恢复软件 您能恢复OPPO上已删除的照片吗?我不小心格式化了OPPO SD 卡,有希望恢复已删除的照片吗? 救命!我在清理时删除了我的照片,我的问题是是否有任何免费软件可以从OPPO中恢复已