Python爬虫爬取、解析数据操作示例


Posted in Python onMarch 27, 2020

本文实例讲述了Python爬虫爬取、解析数据操作。分享给大家供大家参考,具体如下:

爬虫 当当网 http://search.dangdang.com/?key=python&act=input&page_index=1

  1. 获取书籍相关信息
  2. 面向对象思想
  3. 利用不同解析方式和存储方式

引用相关库

import requests
import re
import csv
import pymysql
from bs4 import BeautifulSoup
from lxml import etree
import lxml
from lxml import html

类代码实现部分

class DDSpider(object):
  #对象属性 参数 关键字 页数
  def __init__(self,key='python',page=1):
    self.url = 'http://search.dangdang.com/?key='+key+'&act=input&page_index={}'
    self.page = page
    self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'}

    
  #私有对象方法
  def __my_url(self):
    my_url = []
    if self.page < 1:
      my_page = 2
    else:
      my_page = self.page+1
    #循环遍历每一页
    for i in range(1,my_page):
      my_url.append(self.url.format(i))
    return my_url
  
  #私有对象方法 请求数据
  def __my_request(self,url,parser_type):
    #循环遍历每一页
    response = requests.get(url=url,headers=self.headers)
    if response.status_code == 200:
      return self.__my_parser(response.text,parser_type)
    else:
      return None
    
  #私有对象方法 解析数据 1 利用正则 2 bs4 3 xpath
  def __my_parser(self,html,my_type=1):
    if my_type == 1:
      pattern = re.compile('<p.*?class=[\'\"]name[\'\"].*?name=[\'\"]title[\'\"].*?<a.*?title=[\'\"](.*?)[\'\"].*?href=[\'\"](.*?)[\'\"].*?name=[\'\"]itemlist-title[\'\"].*?<p class=[\'\"]detail[\'\"].*?>(.*?)</p>.*?<span.*?class=[\'\"]search_now_price[\'\"].*?>(.*?)</span>.*?<p.*?class=[\'\"]search_book_author[\'\"].*?><span>.*?<a.*?name=[\'\"]itemlist-author[\'\"].*?title=[\'\"](.*?)[\'\"].*?</span>',re.S)
      result = re.findall(pattern,html)
    elif my_type == 2:
      soup = BeautifulSoup(html,'lxml')
      result = []
      title_url = soup.find_all('a',attrs={'name':'itemlist-title'})
      for i in range(0,len(title_url)):
        title = soup.find_all('a',attrs={'name':'itemlist-title'})[i].attrs['title']
        url = soup.find_all('a',attrs={'name':'itemlist-title'})[i].attrs['href']
        price = soup.find_all('span',attrs={'class':'search_now_price'})[i].get_text()
        author = soup.find_all('a',attrs={'name':'itemlist-author'})[i].attrs['title']
        desc = soup.find_all('p',attrs={'class':'detail'})[i].get_text()
        my_tuple = (title,url,desc,price,author)
        result.append(my_tuple)
    else:
      html = etree.HTML(html)
      li_all = html.xpath('//div[@id="search_nature_rg"]/ul/li')
      result = []
      for i in range(len(li_all)):
        title = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="name"]/a/@title'.format(i+1))
        url = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="name"]/a/@href'.format(i+1))
        price = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]//span[@class="search_now_price"]/text()'.format(i+1))
        author_num = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="search_book_author"]/span[1]/a'.format(i+1))
        if len(author_num) != 0:
          #有作者 a标签
          author = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="search_book_author"]/span[1]/a[1]/@title'.format(i+1))
        else:
          #没有作者 a标签
          author = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="search_book_author"]/span[1]/text()'.format(i+1))
        desc = html.xpath('//div[@id="search_nature_rg"]/ul/li[{}]/p[@class="detail"]/text()'.format(i+1))
        my_tuple = (" ".join(title)," ".join(url)," ".join(desc)," ".join(price)," ".join(author))
        result.append(my_tuple)
        
    return result
  
  #私有对象方法 存储数据 1 txt 2 csv 3 mysql
  def __my_save(self,data,save_type=1):
    #循环遍历
    for value in data:
      if save_type == 1:
        with open('ddw.txt','a+',encoding="utf-8") as f:
          f.write('【名称】:{}【作者】:{}【价格】:{}【简介】:{}【链接】:{}'.format(value[0],value[4],value[3],value[2],value[1]))
      elif save_type == 2:
        with open('ddw.csv','a+',newline='',encoding='utf-8-sig') as f:
          writer = csv.writer(f)
          #转化为列表 存储
          writer.writerow(list(value))
      else:
        conn = pymysql.connect(host='127.0.0.1',user='root',passwd='',db='',port=3306,charset='utf8')
        cursor = conn.cursor()
        sql = ''
        cursor.execute(sql)
        conn.commit()
        cursor.close()
        conn.close()
  #公有对象方法 执行所有爬虫操作
  def my_run(self,parser_type=1,save_type=1):
    my_url = self.__my_url()
    for value in my_url:
      result = self.__my_request(value,parser_type)
      self.__my_save(result,save_type)

调用爬虫类实现数据获取

if __name__ == '__main__':
  #实例化创建对象
  dd = DDSpider('python',0)
  #参数 解析方式 my_run(parser_type,save_type)
  # parser_type 1 利用正则 2 bs4 3 xpath 
  #存储方式 save_type 1 txt 2 csv 3 mysql
  dd.my_run(2,1)

==总结一下: ==

1. 总体感觉正则表达式更简便一些 , 代码也会更简便 , 但是正则部分相对复杂和困难
2. bs4和xpath 需要对html代码有一定了解 , 取每条数据多个值时相对较繁琐

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python冒泡排序算法的实现代码
Nov 21 Python
详解Python的Django框架中的templates设置
May 11 Python
简单讲解Python中的闭包
Aug 11 Python
python 中split 和 strip的实例详解
Jul 12 Python
Python中交换两个元素的实现方法
Jun 29 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
使用python的pexpect模块,实现远程免密登录的示例
Feb 14 Python
pandas的排序和排名的具体使用
Jul 31 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
May 16 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
python opencv进行图像拼接
Mar 27 #Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 #Python
Pyspark读取parquet数据过程解析
Mar 27 #Python
Python基于pyecharts实现关联图绘制
Mar 27 #Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 #Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 #Python
Python itertools.product方法代码实例
Mar 27 #Python
You might like
php简单实现多维数组排序的方法
2016/09/30 PHP
php命令行写shell实例详解
2018/07/19 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
js禁止表单重复提交
2017/08/29 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
[41:12]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
Python如何优雅获取本机IP方法
2019/11/10 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
python dumps和loads区别详解
2020/02/04 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
探讨HTML5移动开发的几大特性(必看)
2015/12/30 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
商学院大学生求职的自我评价
2014/03/12 职场文书
活动简报范文
2015/07/22 职场文书
《失物招领》教学反思
2016/02/20 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python