一直以来都是看别人博客学习,这次就自己发个,回馈回馈

先放上成功图,表示可用(末尾有打包的百度云链接供下载测试)

需要的模块,selenium pyquery,pymysql,还需要谷歌浏览器及其chromedriver

京东大药房药品数据,是js渲染,用requests只能抓取静态页面,动态页面无法扑着,可以用selenium自动化模拟登陆页面,这样就做到可见及可爬,废话不多说,开干!

放上 京东大药房:链接

第一步,打开页面F12即开发者工具,查看源码。找到药品信息节点。

然后就是抓取药品信息,如店铺名,药效,价格,评论人数等等


知道位子了,那就可以写代码了

from selenium import webdriver
from pyquery import PyQuery as pqbrowser = webdriver.Chrome()
html = browser.page_sourcedoc = pq(html)items = doc('#J_goodsList li').items()for item in items:shop = item('.p-shop').text()                       #店铺名durg_name = item('.p-name em').text()               #药品名efficacy = item('.p-name .promo-words').text()      #疗效price = item('.p-price').text()                     #价格comments = item('.p-commit a').text()               #评论人数print(shop,durg_name,efficacy,price,comments)

这是一个页面的抓取,翻页,那就需要selenium自动帮我们做了。

这里可以点下一页,也可以输入页码进行跳转,我们这用输入页码来进行翻页,然后点击确定翻页,但难受的是,很多时候执行一次达不到预期效果,所以在这要进行一次是否翻页成功判断

如上图所示,判断页面是否在是我们所要的,ok思路有了那就写吧

import time
from selenium.webdriver.common.by import By
from  selenium.webdriver.support import  expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException,StaleElementReferenceException,ElementNotInteractableExceptionif page > 1:input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage .p-skip > input')) #找到输入页码的地方)submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage .p-skip > a')) #找到确定按钮)input.clear() #清空input.send_keys(page) #输入页码submit.click()   #点击进行翻页wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage .p-num > a.curr'),str(page))) #比较当面页面是否是我们想要的页面wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList li'))) browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #用js进行下拉操作,如不这样,有部分数据加载不出来time.sleep(2)get_products()except TimeoutException:print('出错,重新爬取')index_page(page)except StaleElementReferenceException:print('等待刷新,重新爬取')index_page(page)except ElementNotInteractableException:print('不可交互,重新爬取')index_page(page)

好了,让我们把抓取的数据放到数据库里吧!单独写个,以后就不用在写,干净整洁

import pymysql
import threading
from settings import MYSQL_HOST, MYSQL_DB, MYSQL_PWD, MYSQL_USERclass DataManager():# 单例模式,确保每次实例化都调用一个对象。_instance_lock = threading.Lock()def __new__(cls, *args, **kwargs):if not hasattr(DataManager, "_instance"):with DataManager._instance_lock:DataManager._instance = object.__new__(cls)return DataManager._instancereturn DataManager._instancedef __init__(self):# 建立连接self.conn = pymysql.connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB, charset='utf8')# 建立游标self.cursor = self.conn.cursor()def save_data(self, data):# 数据库操作----写入sql = 'insert into jddurg(shop,durg_name,efficacy,price,comments) values(%s,%s,%s,%s,%s)'try:self.cursor.execute(sql, data)print('保存成功!恭喜!')self.conn.commit()except Exception as e:print('插入数据失败!', e)self.conn.rollback()  # 回滚def __del__(self):# 关闭游标self.cursor.close()# 关闭连接'''
数据库建表格
CREATE TABLE `jddurg` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`shop` varchar(20) DEFAULT NULL,`durg_name` varchar(100) DEFAULT NULL,`efficacy` varchar(150) DEFAULT NULL,`price` varchar(50) DEFAULT NULL,`comments` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
)
'''

配置文件,也单独拉出来,方便以后嘛

# 该文件存储项目中的所有配置参数
MYSQL_HOST = '127.0.0.1' #地址
MYSQL_USER = 'root'      #数据库账户
MYSQL_PWD = '123456'     #数据库密码
MYSQL_DB = 'ok'          #数据库名

好了爬虫那段逻辑我在这整理一下

import time
from mysqldb import DataManager
from selenium import webdriver
from pyquery import PyQuery as pq
from selenium.webdriver.common.by import By
from  selenium.webdriver.support import  expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException,StaleElementReferenceException,ElementNotInteractableExceptionbrowser = webdriver.Chrome()
wait = WebDriverWait(browser,10)   #最多等待时间
db = DataManager()def index_page(page):'''自动切换页码:param page: 当前页码'''print('正在爬取第',page,'页')try:url = 'https://search.jd.com/Search?keyword=%E4%BA%AC%E4%B8%9C%E5%A4%A7%E8%8D%AF%E6%88%BF&enc=utf-8&pvid=20ed755a83784fd5b13356e7bb8f2008'browser.get(url)if page > 1:input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_bottomPage .p-skip > input')) #找到输入页码的地方)submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_bottomPage .p-skip > a')) #找到确定按钮)input.clear() #清空input.send_keys(page) #输入页码submit.click()   #点击进行翻页wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#J_bottomPage .p-num > a.curr'),str(page))) #比较当面页面是否是我们想要的页面wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#J_goodsList li'))) browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #用js进行下拉操作,如不这样,有部分数据加载不出来time.sleep(2)get_products()except TimeoutException:print('出错,重新爬取')index_page(page)except StaleElementReferenceException:print('等待刷新,重新爬取')index_page(page)except ElementNotInteractableException:print('不可交互,重新爬取')index_page(page)def get_products():'''爬取药品信息'''html = browser.page_sourcedoc = pq(html)items = doc('#J_goodsList li').items()for item in items:shop = item('.p-shop').text()                       #店铺名durg_name = item('.p-name em').text()               #药品名efficacy = item('.p-name .promo-words').text()      #疗效price = item('.p-price').text()                     #价格comments = item('.p-commit a').text()               #评论人数print(shop,durg_name,efficacy,price,comments)product = [shop,durg_name,efficacy,price,comments]db.save_data(product)if __name__ == '__main__':page = 3    #最多100页for i in range(1,(page+1)):index_page(i)

文件打包百度云,自己测试玩玩吧:百度云 密码:kh7i

python利用selenium爬取京东数据相关推荐

  1. 【需求】Python利用selenium抓取京东的地址数据

    文章目录 目的 爬取数据 目的 需要收集京东的地址信息省市区 # encoding:utf-8 # FileName: AreaCity # Date: 2022/07/22 11:55 # Auth ...

  2. python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据

    " 一切不经过项目验证的代码都是耍流氓,今天我们就通过一个简单的招聘网站的数据归档进行当前热门岗位的大数据分析,最后以wordcloud进行显示.本文为数据爬取篇." 项目准备: ...

  3. Python利用selenium爬取行政区域存到MySQL里

    from selenium import webdriver import time import pymysqlclass GovementSpider(object):def __init__(s ...

  4. python利用selenium爬取X蜂窝热门游记

    最近因项目需要,学习了下爬虫.之前都是完成的静态网页的爬去,但大部分网页都是动态加载AJAX,所以学习了selenium.当然也可以通过在network中查找隐藏的网页内容,在利用requests去爬 ...

  5. python利用selenium爬取网易云入驻歌手id、歌手主页id、歌手姓名、歌手粉丝数量

    首先需要访问入驻歌手页,可以看到两个a结点中的链接,其中第一个链接为歌手主页,后面的数字是其主页id:第二个链接为歌手的信息主页,后面的数字为歌手id,通过第二个链接的访问可以查看歌手的粉丝数量 成功 ...

  6. Selenium 爬取评论数据,就是这么简单!

    本文来自作者 秦子敬 在 GitChat 上分享「如何利用 Selenium 爬取评论数据?」,「阅读原文」查看交流实录 「文末高能」 编辑 | 飞鸿 一.前言 我们知道,如今的 web 网页数据很多 ...

  7. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  8. python爬取京东手机数据_实例解析Python如何实现爬取京东手机图片

    本文主要为大家分享一篇Python如何实现爬取京东手机图片的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧,希望能帮助到大家. 运行环境Python3.6.4#爬取京东手机图片i ...

  9. 练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中

    练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中 from selenium.webdriver import Chrome, ChromeOptions import t ...

最新文章

  1. 程序员吐槽职场戏精:凌晨三点半发周报,太装了!
  2. rtmp 时间戳问题
  3. ARM Exploitation
  4. php redis decr_对于高并发的问题你知道怎么处理吗?php接口如何处理并发问题
  5. MySQL 删除字段数据某关键字后的所有数据
  6. 中石油训练赛 - 关于我转生变成史莱姆这档事(dfs)
  7. 【学习笔记】浅谈广义矩阵乘法——动态DP
  8. 处理字符串中的单个字符CharAt()
  9. charles-无法抓取https包的解决办法及效果
  10. HBase伪分布式搭建
  11. laravel的表单验证(下面有些信息未验证,转的)
  12. 模型退火的投资组合优化
  13. Y2011_M12_TranslateEnglish
  14. 突然间~两年悄然而过
  15. mmap 文件不能为空
  16. 泊松分布 二项分布 正态分布之间的联系,与绘制高斯分布图
  17. Store generated project files externally
  18. C++的std::packaged_task
  19. 电脑配置要多少功率的电源?电源功率越大越好吗?
  20. 电脑桌面右下方点击失灵,其他桌面区域正常

热门文章

  1. 《Total Commander:万能文件管理器》——12.6. 附录
  2. Linux下查看硬盘序列号、设备序列号、操作系统版本和安装时间、系统启用时间等命令
  3. 华为 matebook D 加装硬盘过程注意事项
  4. 计算机/电脑为什么拥有计算能力
  5. Docker复习07——Docker 网络
  6. 微信小程序注册/登陆,若依后台获取token
  7. 新疆工程学院计算机在哪个校区,2021年新疆大学有几个校区,大一新生在哪个校区...
  8. 《项目管理知识体系指南》(PMBOK®指南)第3 版
  9. Java前叉夹器_新手知识:为什么说公路直装夹器更好呢?
  10. vscode使用ssh连接远程Ubuntu服务器(记录)