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的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
Python六大开源框架对比
Oct 19 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
Nov 02 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
Python实现Linux监控的方法
May 16 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
Python numpy多维数组实现原理详解
Mar 10 Python
Python实现发票自动校核微信机器人的方法
May 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的ob_start();控制您的浏览器cache!
2006/11/25 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Python程序慢的重要原因
2020/09/04 Python
python关于倒排列的知识点总结
2020/10/13 Python
Python通过len函数返回对象长度
2020/10/22 Python
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
使用索引有什么好处
2016/07/27 面试题
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
先进德育工作者事迹材料
2014/01/24 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
天气温馨提示语
2015/07/14 职场文书
运动会100米加油稿
2015/07/21 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
PHP新手指南
2021/04/01 PHP
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android