本次爬取用到的知识点有:

1. selenium

2. pymysql

3  pyquery

正文

1. 分析目标网站

1. 打开某宝首页, 输入"男装"后点击"搜索", 则跳转到"男装"的搜索界面.

2. 空白处"右击"再点击"检查"审查网页元素, 点击"Network".

1) 找到对应的URL, URL里的参数正是Query String Parameters的参数, 且请求方式是GET

 2) 我们请求该URL得到内容就是"Response"里的内容, 那么点击它来确认信息.

 

 3) 下拉看到"男装"字样, 那么再往下找, 并没有发现有关"男装"的商品信息.

 4) 任意复制一个商品信息, 空白处右击再点击"查看网页源代码", 在源码查找该商品, 即可看到该商品的信息.

 5) 对比网页源代码和"Response"响应内容, 发现源代码<script>..........</script>中的商品信息被替换, 这便是采用了JS加密

 6) 如果去请求上面的URL, 得到的则是加密过的信息, 这时就可以利用Selenium库来模拟浏览器, 进而得到商品信息.

2. 获取单个商品界面

1. 请求网站

# -*- coding: utf-8 -*-
from selenium import webdriver   #从selenium导入浏览器驱动
browser = webdriver.Chrome()   #声明驱动对象, 即Chrome浏览器
def get_one_page():'''获取单个页面'''browser.get("https://www.xxxxx.com")  #请求网站

2. 输入"男装", 在输入之前, 需要判断输入框是否存在, 如果存在则输入"男装", 不存在则等待显示成功.

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By                       #导入元素定位方法模块
from selenium.webdriver.support.ui import WebDriverWait           #导入等待判断模块
from selenium.webdriver.support import expected_conditions as EC  #导入判断条件模块
browser = webdriver.Chrome()
def get_one_page():'''获取单个页面'''browser.get("https://www.xxxxx.com") input = WebDriverWait(browser,10).until(                       #等待判断EC.presence_of_element_located((By.CSS_SELECTOR,"#q")))    #若输入框显示成功,则获取,否则等待input.send_keys("男装")                                         #输入商品名称

3. 下一步就是点击"搜索"按钮, 按钮具有属性: 可点击, 那么加入判断条件.

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
def get_one_page():'''获取单个页面'''browser.get("https://www.xxxxx.com")  input = WebDriverWait(browser,10).until(                       EC.presence_of_element_located((By.CSS_SELECTOR,"#q")))    #input.send_keys("男装")   button = WebDriverWait(browser,10).until(                                                        #等待判断EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))) #若按钮可点击, 则获取, 否则等待button.click()                                                                                   #点击按钮

4. 获取总的页数, 同样加入等待判断.

# -*- coding: utf-8 -*-import re
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
browser = webdriver.Chrome()
def get_one_page():'''获取单个页面'''browser.get("https://www.xxxxx.com")input = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))input.send_keys("男装")button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")))button.click()  pages = WebDriverWait(browser, 10).until(  # 等待判断EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total")))  # 若总页数加载成功,则获取总页数,否则等待 return pages.text
def main():pages = get_one_page()print(pages)
if __name__ == '__main__':main()

5. 打印出来的不是我们想要的结果, 利用正则表达式获取, 最后再利用try...except捕捉异常

# -*- coding: utf-8 -*-
import re
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
browser = webdriver.Chrome()
def get_one_page():'''获取单个页面'''try:browser.get("https://www.xxxxx.com")  input = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#q")))    input.send_keys("男装")   button = WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))) button.click()            pages = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.total")))  return pages.textexcept TimeoutException:return get_one_page()   #如果超时,继续获取
def main():pages = get_one_page()pages = int(re.compile("(\d+)").findall(pages)[0]) #采用正则表达式提取文本中的总页数print(pages)
if __name__ == '__main__':main()

关于Selenium的更多内容,可参看官方文档https://selenium-python.readthedocs.io/waits.html

3. 获取多个商品界面

采用获取"到第 页"输入框方式, 切换到下一页, 同样是等待判断

需要注意的是, 最后要加入判断: 高亮是否是当前页

def get_next_page(page):try:input = WebDriverWait(browser, 10).until(                                                                                         EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))                       # 若输入框加载成功,则获取,否则等待input.send_keys(page)                                                                                                               # 输入页码button = WebDriverWait(browser, 10).until(                                                                                       EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))               # 若按钮可点击,则获取,否则等待button.click()                                                                                                                      # 点击按钮WebDriverWait(browser,10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > ul > li.item.active > span"),str(page)))  # 判断高亮是否是当前页except TimeoutException:                                                                                                                # 超时, 继续请求return get_next_page(page)
def main():pages = get_one_page()pages = int(re.compile("(\d+)").findall(pages)[0])for page in range(1,pages+1):get_next_page(page)
if __name__ == '__main__':main()

4. 获取商品信息

首先, 判断信息是否加载成功, 紧接着获取源码并初始化, 进而解析.

需要注意的是, 在"get_one_page"和"get_next_page"中调用之后, 才可执行

def get_info():"""获取详情"""WebDriverWait(browser,20).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-itemlist .items .item")))                #判断商品信息是否加载成功text = browser.page_source                                             #获取网页源码html = pq(text)                                                        #初始化网页源码items = html('#mainsrp-itemlist .items .item').items()                 #采用items方法会得到生成器for item in items:                                                     #遍历每个节点对象data = []image = item.find(".pic .img").attr("data-src")                    #用find方法查找子孙节点,用attr方法获取属性名称price = item.find(".price").text().strip().replace("\n","")        #用text方法获取文本,strip()去掉前后字符串,默认是空格deal = item.find(".deal-cnt").text()[:-2]title = item.find(".title").text().strip()shop = item.find(".shop").text().strip()location = item.find(".location").text()data.append([shop, location, title, price, deal, image])print(data)

5. 保存到MySQL数据库

def save_to_mysql(data):"""存储到数据库"""# 创建数据库连接对象db= pymysql.connect(host = "localhost",user = "root",password = "password",port = 3306, db = "spiders",charset = "utf8")# 获取游标cursor = db.cursor()#创建数据库cursor.execute("CREATE TABLE IF NOT EXISTS {0}(shop VARCHAR(20),location VARCHAR(10),title VARCHAR(255),price VARCHAR(20),deal VARCHAR(20), image VARCHAR(255))".format("男装"))#SQL语句sql = "INSERT INTO {0} values(%s,%s,%s,%s,%s,%s)".format("男装")try:#传入参数sql,dataif cursor.execute(sql,data):#插入数据库db.commit()print("********已入库**********")except:print("#########入库失败#########")#回滚,相当什么都没做db.rollback()#关闭数据库db.close()

完整代码

# -*- coding: utf-8 -*-
'''
有需要Python学习资料的小伙伴吗?小编整理一套Python资料和PDF,感兴趣者可以加学习群:548377875,反正闲着也是闲着呢,不如学点东西啦~~
'''
import re
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
browser = webdriver.Chrome()
def get_one_page(name):'''获取单个页面'''print("-----------------------------------------------获取第一页-------------------------------------------------------")try:browser.get("https://www.xxxxx.com")  input = WebDriverWait(browser,10).until(                       EC.presence_of_element_located((By.CSS_SELECTOR,"#q")))   input.send_keys(name)   button = WebDriverWait(browser,10).until(                                                        EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))) button.click()            pages = WebDriverWait(browser,10).until(                                                           EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > div.total")))  print("----即将解析第一页信息----")get_info(name)print("----第一页信息解析完成----")return pages.textexcept TimeoutException:return get_one_page(name)
def get_next_page(page,name):"""获取下一页"""print("---------------------------------------------------正在获取第{0}页----------------------------------------".format(page))try:input = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input")))                       input.send_keys(page)                                                                                                               button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit")))               button.click()                                                                                                                      WebDriverWait(browser,10).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > ul > li.item.active > span"),str(page)))  print("-----即将解析第{0}页信息-----".format(page))get_info(name)print("-----第{0}页信息解析完成-----".format(page))except TimeoutException:                                                                                                                return get_next_page(page,name)
def get_info(name):"""获取详情""" WebDriverWait(browser,20).until(EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-itemlist .items .item")))                text = browser.page_source                                             html = pq(text)                                                        items = html('#mainsrp-itemlist .items .item').items()                 for item in items:                                                     data = []image = item.find(".pic .img").attr("data-src")                    price = item.find(".price").text().strip().replace("\n","")        deal = item.find(".deal-cnt").text()[:-2]title = item.find(".title").text().strip()shop = item.find(".shop").text().strip()location = item.find(".location").text()data.append([shop, location, title, price, deal, image])for dt in data:save_to_mysql(dt,name)
def save_to_mysql(data,name):"""存储到数据库"""db= pymysql.connect(host = "localhost",user = "root",password = "password",port = 3306, db = "spiders",charset = "utf8")cursor = db.cursor()cursor.execute("CREATE TABLE IF NOT EXISTS {0}(shop VARCHAR(20),location VARCHAR(10),title VARCHAR(255),price VARCHAR(20),deal VARCHAR(20), image VARCHAR(255))".format(name))sql = "INSERT INTO {0} values(%s,%s,%s,%s,%s,%s)".format(name)try:if cursor.execute(sql,data):db.commit()print("********已入库**********")except:print("#########入库失败#########")db.rollback()db.close()
def main(name):pages = get_one_page(name)pages = int(re.compile("(\d+)").findall(pages)[0])for page in range(1,pages+1):get_next_page(page,name)
if __name__ == '__main__':name = "男装"main(name)

Python爬虫项目--爬取某宝男装信息 附带源码相关推荐

  1. Python爬虫项目--爬取某宝男装信息

    本次爬取用到的知识点有: 1. selenium 2. pymysql 3  pyquery ''' 文章:Python爬虫项目--爬取某宝男装信息 作者:Star_Zhao 源自:https://w ...

  2. python爬取新浪微博内容_python新浪微博爬虫,爬取微博和用户信息 (含源码及示例)...

    [实例简介] 这是新浪微博爬虫,采用python+selenium实现. 免费资源,希望对你有所帮助,虽然是傻瓜式爬虫,但是至少能运行.同时rar中包括源码及爬取的示例. 参考我的文章: http:/ ...

  3. Python,自己修改的爬取淘宝网页的代码 修改Python爬虫,爬取淘宝商品信息也不报错,也不输出信息的错误

    代码部分: 下面是正确的: import requests import redef getHTMLText(url):try:r = requests.get(url, timeout = 30)r ...

  4. Python爬虫+selenium——爬取淘宝商品信息和数据分析

    浏览器驱动 点击下载chromedrive .将下载的浏览器驱动文件chromedriver丢到Chrome浏览器目录中的Application文件夹下,配置Chrome浏览器位置到PATH环境. 需 ...

  5. python+scrapy简单爬取淘宝商品信息

    python结合scrapy爬取淘宝商品信息 一.功能说明: 已实现功能: 通过scrapy接入selenium获取淘宝关键字搜索内容下的商品信息. 待扩展功能: 爬取商品中的全部其他商品信息. 二. ...

  6. python爬虫之--爬取当当网商品信息

                                    python爬虫之--爬取当当网图商品信息                                               ...

  7. python爬虫爬取房源_Python爬虫项目--爬取自如网房源信息

    本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...

  8. 爬虫项目--爬取安居客二手房信息

    爬虫实战(爬取安居客二手房信息-成都天府新区) 环境:python3.6 pycharm bs4库 解析方式:bs4 需求:爬取二手房信息字段(titile,house_type,build_time ...

  9. 爬虫项目 | 爬取XX网站招聘信息

    /***本人代码小白 ,第一次做爬虫,代码仅供参考,欢迎大神指点,***/ 项目背景和功能 毕业将近,身为大三的我们,面临找工作的压力,如何快速的找到自己心仪的岗位并且及时投递简历成为同学们关心的问题 ...

最新文章

  1. linux中的网络配置
  2. 【笔记】mysql入门语句8条
  3. 时序分析:使用卡尔曼滤波
  4. 聊聊HystrixEventNotifier
  5. JS组件系列——Bootstrap Table 表格行拖拽
  6. python代码雨_pygame实现烟雨蒙蒙下彩虹雨
  7. leetcode_最长公共前缀
  8. 【手把手带你入门深度学习之150行代码的汉字识别系统】学习笔记 ·002 训练神经网络
  9. 可视化 —— 在线图形绘制
  10. 好用的飞书版固定资产管理系统
  11. 网络安全技术 | 身份认证的革命——生物特征身份认证
  12. 开心一下,39 个奇葩代码注释,看完笑哭了
  13. PHP开发基于Mirai的QQ机器人(一)
  14. SAP中图文展示分摊和分配的区别
  15. 误发邮件如何能撤回?
  16. GBase基本查询操作
  17. python-异常处理_异常类型_处理的异常的方法
  18. 5.4 成员变量的隐藏和方法重写
  19. 随手记——Moment.js
  20. echarts 重新渲染数据

热门文章

  1. c语言用getchar函数输入两个字符c1,c语言:用getchar函数读入两个字符给c1,c2,用putchar和printf输出。思考问题...
  2. R语言使用rpart包构建决策树模型、使用prune函数进行树的剪枝、交叉验证预防过拟合、plotcp可视化复杂度、rpart.plot包可视化决策树、使用table函数计算混淆矩阵评估分类模型性能
  3. R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)
  4. R语言ggplot2可视化:jupyter中设置全局图像大小、jupyter中自定义单个ggplot2图像结果的大小
  5. R语言ggplot2可视化:组合箱图(boxplot)和直方图(histogram)输出组合可视化结果
  6. R语言使用broom包将回归模型(线性回归、逻辑回归、比例风险回归)的结果整理成dataframe并导出到excel等文件中:基于mtcars和colon数据集
  7. python使用imbalanced-learn的RandomOverSampler方法进行上采样处理数据不平衡问题
  8. R可视化绘制指数分布(Exponential Distribution)
  9. 随机梯度下降、批量梯度下降、小批量梯度下降分类是什么?有什么区别?batch_size的选择如何实施、有什么影响?
  10. 棉花糖实验+延迟满足+还是背后的家庭