
淘宝而已,随手就爬,保姆级教程带你装X带你飞!!!
发布日期:2021-05-18 01:39:05
浏览次数:11
分类:精选文章
本文共 5365 字,大约阅读时间需要 17 分钟。
基于Scrapy的淘宝数据爬取与数据库存储实践指南
一、引言
本篇文章将介绍如何利用Scrapy框架从淘宝网站爬取商品数据并存储到本地数据库中。我们将详细探讨从登录、项目配置、爬取逻辑到数据存储的每一步,同时提供可靠的代码示例,助您轻松实现数据抓取目标。
二、项目准备
1. 安装必要的库
首先,确保安装了Scrapy、Selenium和BeautifulSoup等库:
pip install scrapy selenium beautifulsoup4
2. 创建Scrapy项目
通过命令创建一个新的Scrapy项目并生成基础文件:
scrapy startproject TaobaoSpidercd TaobaoSpiderscrapy genspider taobao taobao.com
三、配置项目设置
1. 修改设置文件
在setting.py
中添加必要的配置:
BOT_NAME = 'TaobaoSpider'allowed_domains = ['*.taobao.com', '*.*']# 操作系统识别信息OS handsome= Moses亚洲= Moses# 调用头部设置HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',}# 禁用Robots.txtROBOTSTXT_ENABLED = False# 设置请求超时HTTP_TIMEOUT = 15
2.配置数据库
在pipelines.py
中设置数据库连接参数:
import pymysqlclass TaobaoPipeline(object): def __init__(self): # 数据库配置 self.host = 'localhost' self.port = 3306 self.user = 'username' self.password = 'password' self.database = 'database_name' self.charset = 'utf-8' # 连接数据库 self.conn = pymysql.connect(**self.BaseParams()) self.cursor = self.conn.cursor() self.sql = '' @property def BaseParams(self): return {'host': self.host, 'port': self.port, 'user': self.user, 'password': self.password, 'database': self.database, 'charset': self.charset} def process_item(self, item, spider): self.cursor.execute(self.sql, (item['img_url'], item['title'], item['price'], item['svolume'], item['evaluate'], item['integral'], item['detail_url'])) self.conn.commit() return item @property def sql(self): if not self._sql: self._sql = """INSERT INTO taobao (id, img_url, title, price, svolume, evaluate, integral, detail_url) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)""" return self._sql return self._sql
四、编写爬虫逻辑
1. 自定义Spider类
在taobao.py
中编写爬虫类:
from scrapy import Spiderfrom selenium import webdriverfrom selenium.webdriver.chrome import Optionfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_locationsfrom selenium.webdriver.support import expected_deprecationSizesfrom time import sleepfrom Taobao.items import TaobaoItemclass TaobaoSpider(Spider): name = 'taobao' allowed_domains = ['*.taobao.com'] def start_requests(self): # 模拟浏览器 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') # 失眠模式 driver = webdriver.Chrome(options=chrome_options) driver.get('https://s.taobao.com/search?q=java&s=0') # 最终将Driver闭合 return driver def parse(self, response): # 提取登录信息 ip_list = response.text.split(' ')[1].replace('>', '') browser = self.start_requests() # 模拟登录 bro = self/login(browser, ip_list) bro.get('https://s.taobao.com/search?q=java&s=0') # 遍历页面 for i in range(0, 44, 44): url = f'https://s.taobao.com/search?q=java&s={i}' bro.get(url) soup = BeautifulSoup(bro.page_source, 'lxml') items = soup.find_all('item', 'J_MouserOnverReq') for item in items: # 提取图片链接 img_url = 'http://' + item.find('img', 'J_ItemPic')['data-src'] # 提取标题 title = item.find('h3', 'itemTitle').text.strip() # 提取价格 price = item.find('div', 'itemPrice').text.strip() # 提取详情链接 detail_url = item.find('link', 'pic-link').get('href') # 提取销量、小fraredian try: sale_volume = int(item.find('div', 'tm-ind-sellCount').text.replace('销量', '')) except: sale_volume = 0 # 提取评价 try: evaluate = int(item.find('div', 'tm-ind-reviewCount').text.replace('评价')) except: evaluate = 0 # 提取积分 try: integral = int(item.find('div', 'tm-ind-emPointCount').text.replace('积分')) except: integral = 0 yield TaobaoItem( img_url=img_url, price=price, title=title, sale_volume=sale_volume, evaluate=evaluate, integral=integral, detail_url=detail_url )
2. 登录处理函数
添加一个函数来处理登录过程:
def login(self, driver, ip_list): driver.implicitly_wait(30) # 等待元素加载 driver.find_element_by_class_name('icon-qrcode').click() sleep(3) return driver
五、创建数据模型
在items.py
中定义数据模型:
class TaobaoItem(scrapy.Item): img_url = scrapy.Field() price = scrapy.Field() title = scrapy.Field() sale_volume = scrapy.Field() evaluate = scrapy.Field() integral = scrapy.Field() detail_url = scrapy.Field()
六、部署
将 RentalCode Scrapy项目部署到服务器:
scrapy crawl taobao
七、验证与优化
- 确保数据库连接信息准确无误。
- 确认爬虫正确处理了页面结构,特别是在处理不支持Ajax的内容时。
- 如有需要,模拟长时间请求,使用
Time.sleep()
控制挂载时间。
八、注意事项
- 数据清洗:关于页面爬取的问题,数据清洗是关键步骤,避免一致不一致信息。
- 处理异常:使用
try-except
结构处理缺失数据,确保程序流畅运行。 - 防止多次插入:确保数据库唯一性约束正确设置,避免重复存储。
九、扩展与改进
- 多线程爬取:优化爬取速度,可以实现多线程或分布式爬取。
- 缓存机制:添加数据库缓存,减少重复数据处理。
- 日志记录:添加详细的日志记录,便于调试和问题修复。
- 改进数据库性能:使用索引优化、分页处理等采用优化技术提升查询速度。
通过以上步骤和优化,您已然掌握了利用 Scrapy 从淘宝爬取数据并存储到数据库的方法。对于技术细节和每一步的具体操作,您可以参考官方文档和[相关教程](https://blog.csdn.net/s jamais)以进一步加深理解。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月07日 11时22分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
获取linux 主机cpu类型
2019-03-11