文章目录

  • 前言
  • 1. 项目预览
  • 2. 库的引入
  • 3. 爬取流程
  • 4. 驱动浏览器搜索关键字
    • 4. 1页面分析
    • 4.2 驱动浏览器代码
  • 5. 解析页面
    • 5.1 页面分析
    • 5.2 页面解析代码
  • 6. 保存到数据库
  • 7. 翻页
    • 7.1 页面分析
    • 7.2 翻页代码
  • 8. 完整代码

前言

本篇文章是在学习崔庆才教学视频16课时后写的。教学视频中爬取的是淘宝,由于我发现淘宝需要登录,就换用了京东商城,但发现京东商城的难度一点也不必淘宝的低,最后搞了一下午才完成。淘宝的数据是一次性全部获取的,而京东商城的数据分两次获取:先加载一般的数据,当鼠标滚动框下滑到一定位置时再通过ajax加载余下的数据。
本次爬取京东商城的手机信息(商品名称,商品图片,商品价格,评价数,店名),并把它存入MongoDB中。本次爬取的都是索引界面的信息,没有深入去爬取详情界面的信息,

1. 项目预览

项目目录

数据库

2. 库的引入

创建spider_jd.py文件,并把下面的引用加入到文件中,要确保安装好
:如果selenium驱动不了chrome浏览器,可能是没有下载chromedriver,百度下载一个就好

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
import time
from pyquery import PyQuery as pq
from urllib.parse import urlencode
import requests
from config_jd import *
import pymongo

3. 爬取流程

1.使用selenium驱动浏览器,打开京东,在搜索框中输入关键字,点击搜索按钮
2.获取并解析页面,获得自己想要的数据
3.将数据存入mongodb中
4.翻页,继续爬取下一页内容

4. 驱动浏览器搜索关键字

4. 1页面分析

我们首先要用webdriver,打开浏览器,进入到京东首页,然后获取到搜索栏和确定按钮,然后驱动浏览器输入关键字,并搜索

搜索栏:

确定按钮:

4.2 驱动浏览器代码

spider_jd.py

    KEYWORD = '手机'  #设置关键字,用于搜索browser = webdriver.Chrome()  #获取浏览器对象wait = WebDriverWait(browser, 10)  #显式等待#搜索函数,用于第一次搜索某个关键字def search():try:#驱动浏览器打开京东商城browser.get('https://www.jd.com')#显示等待,获取到文本框,#key为搜索框的idinput = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#key')))#显示等待,获取搜索按钮,#search > div > div.form > button 为搜索框的css选择器submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#search > div > div.form > button')))#向文本框中输入关键字input.send_keys(KEYWORD)#点击提交按钮submit.click()#将浏览器,滚动条向下滚动scroll()#获取数据,这里先获取第一页get_products(1)#获取总页数,显示等待total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')))return total.textexcept TimeoutError:#如果发生超时错误,递归调用return search()
#该方法用于驱动浏览器向下滚动,出发ajax请求,这里中间会让进程睡几秒中,给浏览器加载页面的时间def scroll():js = 'window.scrollTo(0,6000)'#向下滚动页面browser.execute_script(js)#让进城睡上几秒,给浏览器加载页面time.sleep(3)js = 'window.scrollTo(0,12000)'browser.execute_script(js)time.sleep(2)

5. 解析页面

5.1 页面分析

京东的数据是分两次返回的,首先返回30条数据

当你继续往下翻时,会通过ajax返回另外30条数据,下图是请求的参数。我们在获取第一部分的信息后,需要使用驱动浏览器滚动条向下滚,出发ajax请求,然后通过requests获取ajax请求的信息
注意这里page信息,我们正常上看的一页,对应着后台代码的两页。


5.2 页面解析代码
#获取页面商品信息
def get_products(page):#等待第一次数据加载完wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_goodsList > ul > li')))#获取页面信息html = browser.page_source#使用pyquery解析页面,页面中商品信息在li中doc = pq(html)items = doc('#J_goodsList > ul > li').items()#挨个解析商品,通过find()函数和css选择器,获取标题,图片,价格,评论数,店家信息#快捷获取选择器的方法:chrome浏览器,F12,右击想要获取的那个标签,右击->Copy->copy selector,即可直接获得选择器for item in items:product = {'title': item.find(' div > div.p-name.p-name-type-2 > a > em').text().replace('\n',''),'image': item.find(' div > div.p-img > a > img').attr('src'),'price': item.find(' div > div.p-price > strong').text(),'commit': item.find(' div > div.p-commit > strong > a').text()[:-2],'shop': item.find(' div > div.p-shop > span > a').text()}#打印并保存到mongodb中print(product)save_to_mongo(product)#下面开始对获取第二批的信息,data为请求的参数#这里是第二次加载页面,page应该称2data = {'keyword': KEYWORD,'enc': 'utf-8','qrst': '1','rt': '1','stop': '1','vt': '2','wq': KEYWORD,'stock': '1','page': page*2,'s': '133','scrolling': 'y','tpl': '1_M',}#记得传入请求头,用自己的浏览器信息headers = {'Referer': 'https://search.jd.com/Search?keyword=%E7%BE%8E%E9%A3%9F&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E7%BE%8E%E9%A3%9F&stock=1&page=3&s=55&click=0','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}#请求的链接url = 'https://search.jd.com/s_new.php?'+urlencode(data)#剩下的操作就和上面一模一样了response = requests.get(url, headers = headers)doc = pq(response.text)items = doc('#J_goodsList > ul > li').items()for item in items:product = {'title': item.find(' div > div.p-name.p-name-type-2 > a > em').text().replace('\n', ''),'image': item.find(' div > div.p-img > a > img').attr('src'),'price': item.find(' div > div.p-price > strong').text(),'commit': item.find(' div > div.p-commit > strong > a').text()[:-2],'shop': item.find(' div > div.p-shop > span > a').text()}print(product)save_to_mongo(product)

6. 保存到数据库

创建config_jd.py
输入如下内容

MONGO_URL='localhost'
MONGO_DB='jingdong'
MONGO_TABLE='jingdong'

打开spider_jd.py

#保存结果至MongoDB中
def save_to_mongo(result):if result and db[MONGO_TABLE].insert(result):print('存储到MongoDB成功', result)return Truereturn False

7. 翻页

7.1 页面分析

我们需要获取输入框和点击按钮,想输入框内容传入下页数字,然后点击按钮

7.2 翻页代码

spider_jd.py

def next_page(page_number):try:##先将页面向下滚,确保页面内容刷新出来scroll()#获取文本框input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > input')))#获取确定按钮submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > a')))#将文本框内容情况,然后传入页数,并点击按钮input.clear()input.send_keys(page_number)submit.click()#显式等待,判断页面是否跳转wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.curr'),str(page_number)))#开始获取数据get_products(page_number)except TimeoutError:return next_page(page_number)
#主函数
def main():#爬取第一页并返回页数总数total = int(search())#这里是爬取页数for i in range(2, total):next_page(i)
if __name__ == '__main__':main()

8. 完整代码

spider_jd.py

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
import time
from pyquery import PyQuery as pq
from urllib.parse import urlencode
import requests
from config_jd import *
import pymongo
#设置关键字,用于搜索
KEYWORD = '手机'
#获取浏览器对象
browser = webdriver.Chrome()
#显式等待
wait = WebDriverWait(browser, 10)client = pymongo.MongoClient(MONGO_URL, connect=False) #多进程时设置connect=False,使每个进程在执行时才启动链接,否则会出现警告,
db = client[MONGO_DB]def search():try:#驱动浏览器打开京东商城browser.get('https://www.jd.com')#显示等待,获取到文本框,#key为搜索框的idinput = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#key')))#显示等待,获取搜索按钮,#search > div > div.form > button 为搜索框的css选择器submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#search > div > div.form > button')))#向文本框中输入关键字input.send_keys(KEYWORD)#点击提交按钮submit.click()#将浏览器,滚动条向下滚动scroll()#获取数据get_products(1)#获取总页数,显示等待total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > em:nth-child(1) > b')))return total.textexcept TimeoutError:#如果发生超时错误,递归调用return search()def next_page(page_number):try:##先将页面向下滚,确保页面内容刷新出来scroll()#获取文本框input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > input')))#获取确定按钮submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_bottomPage > span.p-skip > a')))#将文本框内容情况,然后传入页数,并点击按钮input.clear()input.send_keys(page_number)submit.click()#显式等待,判断页面是否跳转wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.curr'),str(page_number)))#开始获取数据get_products(page_number)except TimeoutError:return next_page(page_number)#该方法用于驱动浏览器向下滚动,出发ajax请求,这里中间会让进程睡几秒中,给浏览器加载页面的时间
def scroll():js = 'window.scrollTo(0,6000)'#向下滚动页面browser.execute_script(js)#让进城睡上几秒,给浏览器加载页面time.sleep(3)js = 'window.scrollTo(0,12000)'browser.execute_script(js)time.sleep(2)#获取页面商品信息
def get_products(page):#等待第一次数据加载完wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#J_goodsList > ul > li')))#获取页面信息html = browser.page_source#使用pyquery解析页面,页面中商品信息在li中doc = pq(html)items = doc('#J_goodsList > ul > li').items()#挨个解析商品,通过find()函数和css选择器,获取标题,图片,价格,评论数,店家信息for item in items:product = {'title': item.find(' div > div.p-name.p-name-type-2 > a > em').text().replace('\n',''),'image': item.find(' div > div.p-img > a > img').attr('src'),'price': item.find(' div > div.p-price > strong').text(),'commit': item.find(' div > div.p-commit > strong > a').text()[:-2],'shop': item.find(' div > div.p-shop > span > a').text()}#打印并保存到mongodb中print(product)save_to_mongo(product)#下面开始对获取第二批的信息,data为请求的参数#这里是第二次加载页面,page应该称2data = {'keyword': KEYWORD,'enc': 'utf-8','qrst': '1','rt': '1','stop': '1','vt': '2','wq': KEYWORD,'stock': '1','page': page*2,'s': '133','scrolling': 'y','tpl': '1_M',}#记得传入请求头,用自己的浏览器信息headers = {'Referer': 'https://search.jd.com/Search?keyword=%E7%BE%8E%E9%A3%9F&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E7%BE%8E%E9%A3%9F&stock=1&page=3&s=55&click=0','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}#请求的链接url = 'https://search.jd.com/s_new.php?'+urlencode(data)#剩下的操作就和上面一模一样了response = requests.get(url, headers = headers)doc = pq(response.text)items = doc('#J_goodsList > ul > li').items()for item in items:product = {'title': item.find(' div > div.p-name.p-name-type-2 > a > em').text().replace('\n', ''),'image': item.find(' div > div.p-img > a > img').attr('src'),'price': item.find(' div > div.p-price > strong').text(),'commit': item.find(' div > div.p-commit > strong > a').text()[:-2],'shop': item.find(' div > div.p-shop > span > a').text()}print(product)save_to_mongo(product)#保存结果至MongoDB中
def save_to_mongo(result):if result and db[MONGO_TABLE].insert(result):print('存储到MongoDB成功', result)return Truereturn Falsedef main():#爬取第一页并返回页数总数total = int(search())#这里是爬取页数for i in range(2, 5):next_page(i)if __name__ == '__main__':main()

config_jd.py

MONGO_URL='localhost'
MONGO_DB='jingdong'
MONGO_TABLE='jingdong'

【爬虫】用Selenium+PyQuery爬取京东商城相关推荐

  1. python 爬网站 实例_python爬虫实战:之爬取京东商城实例教程!(含源代码)

    前言: 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1 ...

  2. Python爬虫教程:Python爬取京东商城商品大图详解

    Python爬取京东商城商品大图详解 做为一个爬虫初学者,在做爬取网址图片的练习中以京东网为例爬取商品大图并保存在相应的文件夹 1.导入模块 import urllib.request import ...

  3. 用Selenium+xpath爬取京东商城

    前言 这两天原本想在淘宝上爬点东西进行分析的,但没想到淘宝的反爬机制对我这个爬虫菜鸡充满了恶意.先是被数据的格式搞得焦头烂额,好不容易写好了测试一页的代码,准备美滋滋开始大显身手,爬取多页时,发现竟然 ...

  4. 【selenium爬虫】 selenium自动化爬取京东图书信息

    一.题目要求:搜索京东图书页,自动点击详情页进入,爬取数据信息并且存储到csv中二.解题思路:1.需要下载一个chromedriver.exe.下载地址:ChromeDriver Mirror 注意: ...

  5. python爬京东联盟_python爬虫框架scrapy实战之爬取京东商城进阶篇

    前言 之前的一篇文章已经讲过怎样获取链接,怎样获得参数了,详情请看python爬取京东商城普通篇,本文将详细介绍利用python爬虫框架scrapy如何爬取京东商城,下面话不多说了,来看看详细的介绍吧 ...

  6. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  7. 爬虫利器Pyppeteer的介绍和使用 爬取京东商城书籍信息!

    提起 selenium 想必大家都不陌生,作为一款知名的 Web 自动化测试框架,selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用.但是 seleniu ...

  8. 利用python爬虫爬取京东商城商品图片

    笔者曾经用python第三方库requests来爬取京东商城的商品页内容,经过解析之后发现只爬到了商品页一半的图片.(这篇文章我们以爬取智能手机图片为例) 当鼠标没有向下滑时,此时查看源代码的话,就会 ...

  9. python爬虫完整实例-python爬虫实战之爬取京东商城实例教程

    前言 本文主要介绍的是利用python爬取京东商城的方法,文中介绍的非常详细,下面话不多说了,来看看详细的介绍吧. 主要工具 scrapy BeautifulSoup requests 分析步骤 1. ...

最新文章

  1. python使用方法-python中dict使用方法详解
  2. OpenCv 005---图像像素的算术操作
  3. PAT甲级1083 List Grades:[C++题解]结构体、排序
  4. PMcaff-活动| 产品经理免费培训最后一批通过名单公布啦!
  5. minwindow java_java中setMinWindowLayout()是什么呀?
  6. shipyard安装
  7. python calendar.isleap_Python calendar isleap()用法及代碼示例
  8. matlab与c 混合编程问题,MATLAB与C/C++混合编程的一些总结
  9. Hibernate继承映射
  10. Oracle优化新常态 前半生
  11. 英语语法3-现在进行时
  12. 项目管理必看书籍推荐
  13. 给定C语言数据结构,给定C语言的数据结构struct T { int w; union T { char c;int i;double d;)U; };...
  14. 登陆成功页面5秒跳转
  15. 【实用工具】Gephi下载与安装
  16. java归并排序详解
  17. 开源协议MIT、BSD、Apache
  18. FreeBSD10 安装
  19. 英语口语(英语词根与单词的说文解字(李平武 2008版)读书笔记)
  20. 2022ICPC网络赛第二场

热门文章

  1. 吴恩达Coursera, 机器学习专项课程, Machine Learning:Advanced Learning Algorithms第三周编程作业...
  2. IPDK — Overview
  3. 图片优化须知的8个小技巧
  4. 饭局时领导当众夸奖你(职场高手的应对方法)
  5. 随书光盘查找网站分享
  6. Zeta:eBay 基于 Apache Spark 开发的新一代数据开发分析平台
  7. springboot毕设项目享瘦减肥中心管理系统47ccq(java+VUE+Mybatis+Maven+Mysql)
  8. 计算机组成原理 cpu图,计算机组成原理和结构图式(第三章 CPU子系统)(示例代码)...
  9. openGL之API学习(一八七)gl_Vertex
  10. 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架(2)