Python Selenium + PhantomJS爬取考拉海购商品数据
2018-01-07 18:38
609 查看
爬完QQ音乐以后打算爬网易云音乐的,中间出了一点小状况,就改爬考拉海购了(什么状况你猜呀❛˓◞˂̶✧以后会爬完网易云音乐的!)
今天写近段时间的最后一篇,写完这篇就要开始期末复习了,寒假再来更新
进入正题,准备工作如下:
Selenium、Selenium官方文档、PhantomJS
下载了pip的话也可以用
pip install selenium
下载selenium
这次用到的东西官方文档都可以查到,我就不细说了,直接上代码
中间出了个小bug,就是我注释掉的这一段
这里click失效了,百度到了解决方法
js解决click失效问题参考博客
开始爬
爬完
看一下数据库里的情况
完美
参考视频教程:Python3爬虫三大案例实战分析
到这里就结束啦~寒假见
冷…
今天写近段时间的最后一篇,写完这篇就要开始期末复习了,寒假再来更新
进入正题,准备工作如下:
Selenium、Selenium官方文档、PhantomJS
下载了pip的话也可以用
pip install selenium
下载selenium
这次用到的东西官方文档都可以查到,我就不细说了,直接上代码
import time 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 from selenium.common.exceptions import TimeoutException#用来处理超时异常 from pyquery import PyQuery as pq#用来解析网页源码 from sqlalchemy import create_engine,MetaData#引入数据库引擎create_engine以及引入MetaData来创建表格 from sqlalchemy.orm import sessionmaker#引入sessionmaker(用来创建数据工厂) from sqlalchemy import Table,Column,Text#引入我们需要用到的属性 from sqlalchemy.sql import insert#引入插入语句 #创建一个数据库引擎,调用create_engin方法,连接postgresql数据库,用户名为postgres,密码为123456,储存地址为本地存储,端口为5432数据库名为postgres engine = create_engine('postgresql://postgres:123456@localhost:5432/postgres') meta = MetaData(bind = engine)#将MetaData绑定到引擎上 Session = sessionmaker(bind = engine)#将sessionmaker绑定到引擎上,创建一个session工厂 session = Session()#调用工厂方法来创建一个session对象 KaoLa_table = Table('KaoLa', meta, # 表名为KaoLa,数据库内一定不能有相同表名!!! Column('good_name', Text), # 将good_name作为列名(key),并用primary设置为主key,用Text类型显示 Column('price', Text), Column('comment', Text), Column('origin', Text), Column('store', Text), Column('url', Text)) meta.create_all() # 建立表格 choice = ['--load-images=false','--disk-cache=true']#PhantomJS的api,不加载图片,开启缓存 browser = webdriver.PhantomJS(service_args=choice)#选择PhantomJS浏览器并加入参数 browser.set_window_size(1400,900)#设置浏览器窗口大小,便于selenium运行 waite = WebDriverWait(browser, 10)#设置等待时间 key = '彩妆'#设置需要搜索的关键字 def search(): print('搜索中') try: browser.get('https://www.kaola.com') # 用来关闭弹窗 close = waite.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#index-netease-com > table > tbody > tr > td > div > div > div > div > div.modal-body > div > div.u-close")) ) # 用来输入搜索内容 input = waite.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#topSearchInput"))#用css_selector检索 ) #用这个方法去点击,select会受上一次select的影响,从而使click失效 #submit = waite.until( #EC.element_to_be_clickable((By.XPATH, "//*[@id='topSearchBtn']")) #) close.click() input.send_keys(key) #submit.click() # 上面click点击失效的问题用此法解决了 js大法好 #用来点击搜索 js = 'document.getElementsByClassName("w-icon w-icon-27")[0].click();' browser.execute_script(js) print('当前正在第 1 页') get_products() except TimeoutException: return search() def next_page(): try: click_next = waite.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#resultwrap > div.splitPages > a.nextPage")) ) click_next.click() now_page = browser.find_element_by_xpath("//*[@id='resultwrap']/div[3]/span[1]").text#用xpath方法检索 print('当前正在第', now_page, '页') time.sleep(1) get_products() return next_page() #这里最后一页不存在下一页按钮,所以处理必定超时,可以用这个超时来判断是否翻页完毕 except TimeoutException: end_page = browser.find_element_by_xpath("//*[@id='resultwrap']/div[3]/span[1]").text print('翻页完毕,第',end_page,'页') print('存储完毕') def get_products(): waite.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#result > li > div")) ) html = browser.page_source#用这个语句拿到整个网页的源代码 doc = pq(html)#用PyQuery解析 goods = doc("#result > li > div").items() kaola_url = 'https://www.kaola.com' for good in goods: #用find方法检索 product = { 'good_name': good.find('.title').text(), 'price': good.find('.cur').text(), 'comment':good.find('.comments').text(), 'origin':good.find('.proPlace.ellipsis').text(), 'store':good.find('.selfflag').text(), 'url':kaola_url + good.find('.title').attr('href') } save_data(product) def save_data(data): try: i = insert(KaoLa_table) # 插入数据 i = i.values({'good_name': data['good_name'], 'price': data['price'], 'comment': data['comment'], 'origin': data['origin'], 'store': data['store'], 'url': data['url']}) session.execute(i) # 将数据插入表格 session.commit() # 提交到数据库中 print('存储成功:',data) except Exception: print('存储失败:',data) if __name__ == "__main__": try: search() next_page() except Exception: print('出错啦') finally: browser.close()#记得关闭浏览器
中间出了个小bug,就是我注释掉的这一段
这里click失效了,百度到了解决方法
js解决click失效问题参考博客
开始爬
爬完
看一下数据库里的情况
完美
参考视频教程:Python3爬虫三大案例实战分析
到这里就结束啦~寒假见
冷…
相关文章推荐
- Python Selenium + PhantomJS爬取考拉海购商品数据
- [Python爬虫] 之二十:Selenium +phantomjs 利用 pyquery通过搜狗搜索引擎数据
- [Python爬虫] 之二十二:Selenium +phantomjs 利用 pyquery抓取界面网站数据
- [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
- [Python爬虫] 之十八:Selenium +phantomjs 利用 pyquery抓取电视之家网数据
- [Python爬虫] 之二十一:Selenium +phantomjs 利用 pyquery抓取36氪网站数据
- [Python爬虫] 之十九:Selenium +phantomjs 利用 pyquery抓取超级TV网数据
- Python+Selenium+Phantomjs数据抓取环境配置实践
- Python3 ubuntu16.04 phantomjs 与 selenium 抓取数据
- Selenium + PhantomJS爬去动态网站的数据示例(Python)
- [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据
- 用Python+Selenium+PhantomJS实现采集动态数据的小爬虫
- [Python爬虫] 之十四:Selenium +phantomjs抓取媒介360数据
- python selenium 爬取淘宝商品数据
- [Python爬虫] 之十七:Selenium +phantomjs 利用 pyquery抓取梅花网数据
- [Python爬虫] 之十六:Selenium +phantomjs 利用 pyquery抓取一点咨询数据
- 直播网站LiveTV Mining,爬虫抓取数据 python3+selenium+phantomjs
- python3实现爬取淘宝页面的商品的数据信息(selenium+pyquery+mongodb)
- [Python爬虫] 之二十四:Selenium +phantomjs 利用 pyquery抓取中广互联网数据
- python+selenium+PhantomJS抓取ajax动态网页数据