Python爬取当当、京东、亚马逊图书信息代码实例


Posted in Python onDecember 09, 2017

注:1.本程序采用MSSQLserver数据库存储,请运行程序前手动修改程序开头处的数据库链接信息

2.需要bs4、requests、pymssql库支持

3.支持多线程

from bs4 import BeautifulSoup 
import re,requests,pymysql,threading,os,traceback 
 
try: 
  conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='book',charset="utf8") 
  cursor = conn.cursor() 
except: 
  print('\n错误:数据库连接失败') 
 
#返回指定页面的html信息 
def getHTMLText(url): 
  try: 
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'} 
    r = requests.get(url,headers = headers) 
    r.raise_for_status() 
    r.encoding = r.apparent_encoding 
    return r.text 
  except: 
    return '' 
#返回指定url的Soup对象 
def getSoupObject(url): 
  try: 
    html = getHTMLText(url) 
    soup = BeautifulSoup(html,'html.parser') 
    return soup 
  except: 
    return '' 
#获取该关键字在图书网站上的总页数 
def getPageLength(webSiteName,url): 
  try: 
    soup = getSoupObject(url) 
    if webSiteName == 'DangDang': 
      a = soup('a',{'name':'bottom-page-turn'}) 
      return a[-1].string 
    elif webSiteName == 'Amazon': 
      a = soup('span',{'class':'pagnDisabled'}) 
      return a[-1].string 
  except: 
    print('\n错误:获取{}总页数时出错...'.format(webSiteName)) 
    return -1 
 
class DangDangThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 
  def run(self): 
    print('\n提示:开始爬取当当网数据...') 
    count = 1 
   
    length = getPageLength('DangDang','http://search.dangdang.com/?key={}'.format(self.keyword))#总页数 
    tableName = 'db_{}_dangdang'.format(self.keyword) 
 
    try: 
      print('\n提示:正在创建DangDang表...') 
      cursor.execute('create table {} (id int ,title text,prNow text,prPre text,link text)'.format(tableName)) 
      print('\n提示:开始爬取当当网页面...') 
      for i in range(1,int(length)): 
        url = 'http://search.dangdang.com/?key={}&page_index={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'class':re.compile(r'line'),'id':re.compile(r'p')}) 
        for li in lis: 
          a = li.find_all('a',{'name':'itemlist-title','dd_name':'单品标题'}) 
          pn = li.find_all('span',{'class': 'search_now_price'}) 
          pp = li.find_all('span',{'class': 'search_pre_price'}) 
 
          if not len(a) == 0: 
            link = a[0].attrs['href'] 
            title = a[0].attrs['title'].strip() 
          else: 
            link = 'NULL' 
            title = 'NULL' 
 
          if not len(pn) == 0: 
            prNow = pn[0].string 
          else: 
            prNow = 'NULL' 
 
          if not len(pp) == 0: 
            prPre = pp[0].string 
          else: 
            prPre = 'NULL' 
          sql = "insert into {} (id,title,prNow,prPre,link) values ({},'{}','{}','{}','{}')".format(tableName,count,title,prNow,prPre,link) 
          cursor.execute(sql) 
          print('\r提示:正在存入当当数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except: 
      pass 

class AmazonThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 
 
  def run(self): 
    print('\n提示:开始爬取亚马逊数据...') 
    count = 1 
    length = getPageLength('Amazon','https://www.amazon.cn/s/keywords={}'.format(self.keyword))#总页数 
    tableName = 'db_{}_amazon'.format(self.keyword) 
     
    try: 
      print('\n提示:正在创建Amazon表...') 
      cursor.execute('create table {} (id int ,title text,prNow text,link text)'.format(tableName)) 
   
      print('\n提示:开始爬取亚马逊页面...') 
      for i in range(1,int(length)): 
        url = 'https://www.amazon.cn/s/keywords={}&page={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'id':re.compile(r'result_')}) 
        for li in lis: 
          a = li.find_all('a',{'class':'a-link-normal s-access-detail-page a-text-normal'}) 
          pn = li.find_all('span',{'class': 'a-size-base a-color-price s-price a-text-bold'}) 
          if not len(a) == 0: 
            link = a[0].attrs['href'] 
            title = a[0].attrs['title'].strip() 
          else: 
            link = 'NULL' 
            title = 'NULL' 
 
          if not len(pn) == 0: 
            prNow = pn[0].string 
          else: 
            prNow = 'NULL' 
 
          sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link) 
          cursor.execute(sql) 
          print('\r提示:正在存入亚马逊数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except: 
      pass 

class JDThread(threading.Thread): 
  def __init__(self,keyword): 
    threading.Thread.__init__(self) 
    self.keyword = keyword 
  def run(self): 
    print('\n提示:开始爬取京东数据...') 
    count = 1 
 
    tableName = 'db_{}_jd'.format(self.keyword) 
     
    try: 
      print('\n提示:正在创建JD表...') 
      cursor.execute('create table {} (id int,title text,prNow text,link text)'.format(tableName)) 
      print('\n提示:开始爬取京东页面...') 
      for i in range(1,100): 
        url = 'https://search.jd.com/Search?keyword={}&page={}'.format(self.keyword,i) 
        soup = getSoupObject(url) 
        lis = soup('li',{'class':'gl-item'}) 
        for li in lis: 
          a = li.find_all('div',{'class':'p-name'}) 
          pn = li.find_all('div',{'class': 'p-price'})[0].find_all('i') 
 
          if not len(a) == 0: 
            link = 'http:' + a[0].find_all('a')[0].attrs['href'] 
            title = a[0].find_all('em')[0].get_text() 
          else: 
            link = 'NULL' 
            title = 'NULL' 
           
          if(len(link) > 128): 
            link = 'TooLong' 
 
          if not len(pn) == 0: 
            prNow = '¥'+ pn[0].string 
          else: 
            prNow = 'NULL' 
          sql = "insert into {} (id,title,prNow,link) values ({},'{}','{}','{}')".format(tableName,count,title,prNow,link) 
          cursor.execute(sql) 
          print('\r提示:正在存入京东网数据,当前处理id:{}'.format(count),end='') 
          count += 1 
          conn.commit() 
    except : 
      pass 
def closeDB(): 
  global conn,cursor 
  conn.close() 
  cursor.close() 
 
def main(): 
  print('提示:使用本程序,请手动创建空数据库:Book,并修改本程序开头的数据库连接语句') 
  keyword = input("\n提示:请输入要爬取的关键字:") 
 
  dangdangThread = DangDangThread(keyword) 
  amazonThread = AmazonThread(keyword) 
  jdThread = JDThread(keyword) 
   dangdangThread.start() 
  amazonThread.start() 
  jdThread.start() 
  dangdangThread.join() 
  amazonThread.join() 
  jdThread.join() 
   closeDB() 
   print('\n爬取已经结束,即将关闭....') 
  os.system('pause') 
   
main()

示例截图:

关键词:Android下的部分运行结果(以导出至Excel)

Python爬取当当、京东、亚马逊图书信息代码实例

Python爬取当当、京东、亚马逊图书信息代码实例

Python爬取当当、京东、亚马逊图书信息代码实例

总结

以上就是本文关于Python爬取当当、京东、亚马逊图书信息代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python selenium如何设置等待时间
Sep 15 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
python 列表推导式使用详解
Aug 29 Python
python实现大量图片重命名
Mar 23 Python
python中取绝对值简单方法总结
Jul 24 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
python爬取亚马逊书籍信息代码分享
Dec 09 #Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 #Python
K-近邻算法的python实现代码分享
Dec 09 #Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 #Python
python学习之matplotlib绘制散点图实例
Dec 09 #Python
Python学习pygal绘制线图代码分享
Dec 09 #Python
Python编程pygal绘图实例之XY线
Dec 09 #Python
You might like
PHP的面向对象编程
2006/10/09 PHP
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
PHP的5个安全措施小结
2012/07/17 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
php简单截取字符串代码示例
2016/10/19 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python 图片验证码代码分享
2012/07/04 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
六年级数学教学反思
2014/02/03 职场文书
机关搬迁方案
2014/05/18 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
2015年女生节活动总结
2015/02/27 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
2015年统战工作总结
2015/05/19 职场文书