鱼C论坛

 找回密码
 立即注册
查看: 2252|回复: 1

关于爬虫爬取数据存到MYSQL库的问题

[复制链接]
发表于 2018-4-12 12:53:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wongyusing 于 2018-4-12 13:49 编辑

代码如下:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time    : 18-4-11 下午1:43
  4. # @Author  : Aries
  5. # @Site    :
  6. # @File    : taobao.py
  7. # @Software: PyCharm

  8. import re
  9. from selenium import webdriver #浏览器驱动
  10. from selenium.webdriver.common.by import By #定位模块
  11. from selenium.webdriver.support.ui import WebDriverWait #页面元素
  12. from selenium.webdriver.support import expected_conditions as EC#显性等待页面加载
  13. from pyquery import PyQuery as pq #Python爬虫中的一种网页解析库

  14. import pymysql


  15. conn = pymysql.connect(host='localhost', db='test', user='root', passwd='wongyusing',charset='utf8')
  16. cur = conn.cursor()

  17. url = 'https://www.taobao.com/'
  18. browser = webdriver.Chrome() #浏览器
  19. wait = WebDriverWait(browser,10)#等待页面加载10s


  20. def search():
  21.     try:
  22.         browser.get(url)

  23.         # 定位输入栏
  24.         inpot = wait.until(
  25.             EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
  26.             )
  27.         #定位”搜索“按钮
  28.         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
  29.         inpot.send_keys('咖啡')#输入内容,以后可以创建一个列表,从而实现批量爬取
  30.         submit.click()#点击”搜索“按钮
  31.         #获取总页数
  32.         total = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))[0]
  33.         get_content()#获取内容
  34.         return total.text   #共100页
  35.     except TimeoutError:
  36.         return search()

  37. def next_page(page_num):#翻页操作,根据输入的页码在输入栏中翻页
  38.     try:
  39.         #获取页码输入栏
  40.         inpot = wait.until(
  41.             EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
  42.         )
  43.         #定位并点击“确定”按钮
  44.         submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
  45.         inpot.clear()#清除之前输入的页码
  46.         inpot.send_keys(page_num)#输入页码
  47.         submit.click()#点击“确定"按钮
  48.         wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_num)))
  49.         get_content()#获取内容
  50.     except TimeoutError:
  51.         next_page(page_num)


  52. def get_content():#获取信息/内容
  53.     #定位商品列表
  54.     wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
  55.     html = browser.page_source                                    #注意这里的mainsrp-itemlist(晚上)
  56.     doc = pq(html)                                                #有时会变成m-itemlist(下午)
  57.     items = doc('#mainsrp-itemlist .items .item').items()#获取内容列表
  58.     for item in items:
  59.         content = {
  60.             'title': item.find('.title').text(),          # 标题
  61.             'shop': item.find('.shop').text(),            # 店铺名称
  62.             'price': item.find('.price').text(),          # 价格
  63.             'url': item.find('.title .a').attr('href'),   # 連接
  64.             'img': item.find('.pic .img').attr('src'),    # 图片
  65.             'deal': item.find('.deal-cnt').text()[:-3],   # 交易数量
  66.             'location': item.find('.location').text(),    # 发货地点
  67.         }
  68.         print(content)#打印内容(测试),成功,内容如下一行
  69.         #{'deal': '6429', 'title': '【旗舰店】雀巢\n咖啡\n法国进口冻干法式金牌黑\n咖啡\n100g+50g*2装', 'price': '¥\n138.00', 'shop': '雀巢官方旗舰店', 'location': '上海', 'img': '//g-search3.alicdn.com/img/bao/uploaded/i4/i2/745949152/TB1NoI1kQSWBuNjSszdXXbeSpXa_!!0-item_pic.jpg_180x180.jpg'}
  70.         #cur.execute(content)#存入数据库MYSQL
  71.         #conn.commit()

  72. def gogo():#主函数
  73.     totla = search()#打开淘宝首页,输入”需要搜索的内容“。获取内容,返回最大页数
  74.     totla = int(re.compile('(\d+)').search(totla).group(1))#得到总页数并迭代出来
  75.     for i in range(2,totla+1):#因为第一页已经获取内容了,从第二页开始获取
  76.         next_page(i)#获取内容后,在网页的底部的跳转页码栏中输入页码翻页

  77.     #conn.close()
  78. if __name__ == '__main__':
  79.     gogo()



复制代码


问题如下:
1.现在数据已经采集完毕,没有问题,但我入库总是报错。该如何修改?
  1. Traceback (most recent call last):
  2.   File "/home/sing/桌面/TaoBao/taobao.py", line 92, in <module>
  3.     gogo()
  4.   File "/home/sing/桌面/TaoBao/taobao.py", line 85, in gogo
  5.     totla = search()#打开淘宝首页,输入”需要搜索的内容“。获取内容,返回最大页数
  6.   File "/home/sing/桌面/TaoBao/taobao.py", line 41, in search
  7.     get_content()#获取内容
  8.   File "/home/sing/桌面/TaoBao/taobao.py", line 81, in get_content
  9.     cur.execute(content)#存入数据库MYSQL
  10.   File "/usr/local/lib/python3.5/dist-packages/pymysql/cursors.py", line 165, in execute
  11.     result = self._query(query)
  12.   File "/usr/local/lib/python3.5/dist-packages/pymysql/cursors.py", line 321, in _query
  13.     conn.query(q)
  14.   File "/usr/local/lib/python3.5/dist-packages/pymysql/connections.py", line 859, in query
  15.     self._execute_command(COMMAND.COM_QUERY, sql)
  16.   File "/usr/local/lib/python3.5/dist-packages/pymysql/connections.py", line 1095, in _execute_command
  17.     packet = prelude + sql[:packet_size-1]
  18. TypeError: unhashable type: 'slice'
复制代码

2.有没有一步一个脚印的MYSQL的教程或者博文??让我借鉴一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-4-12 16:54:35 | 显示全部楼层
你数据库表结构对嘛,而且执行的sql语句我都没看到啊插入的话,至少有一个insert into吧!
#cur.execute(content)#存入数据库MYSQL这个语句要自己写的,人家只是帮你执行而已。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-29 08:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表