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根据出生日期返回年龄的方法
Mar 26 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
centos6.8安装python3.7无法import _ssl的解决方法
Sep 17 Python
python使用epoll实现服务端的方法
Oct 16 Python
python使用Turtle库绘制动态钟表
Nov 19 Python
python ipset管理 增删白名单的方法
Jan 14 Python
如何在python中实现随机选择
Nov 02 Python
Python 文件数据读写的具体实现
Jan 24 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
Python实现微信表情包炸群功能
Jan 28 Python
基于Python实现一个春节倒计时脚本
Jan 22 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下实现折线图效果的代码
2007/04/28 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
JavaScript比较同一天的时间大小实例代码
2018/02/09 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
Liu Jo西班牙官网:意大利服装品牌
2019/09/11 全球购物
高中政治教学反思
2014/01/18 职场文书
新郎婚宴答谢词
2014/01/19 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
雷峰塔导游词
2015/02/09 职场文书
公司优秀员工推荐信
2015/03/24 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang