zoukankan      html  css  js  c++  java
  • 爬虫2-python爬取结构化数据存入mysql

    也可以存入hive、HDFS,这里选择存在mysql。

    一、安装mysql(python在pyspark一节已配置好)

    https://blog.csdn.net/zhouzezhou/article/details/52446608

    安装后找不到bin目录解决方法

    https://blog.csdn.net/cuicui_ruirui/article/details/105840107

    二、python安装操作mysql的库

    pip install pymysql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

    三、在mysql中创建相应的表

    mysql> create database pachong;
    
    mysql> use pachong;
    --##收集字段url, author, bookname, chubanshe, time_print, prince
    mysql> create table dangdang_book(url varchar(100) not null,author varchar(20),bookname varchar(50),chubanshe varchar(50),time_print varchar(50),price varchar(10))charset=utf8;

    四、测试python灌数据到mysql

    conn = pymysql.connect(host='localhost', port=3306, user='root', password='****', db='pachong', charset='utf8')
    cursor = conn.cursor()
    cursor.execute("insert into `dangdang_book` values('aa','bb','c','d','e','f');")
    conn.commit()
    mysql> select * from dangdang_book;
    +-----+--------+----------+-----------+------------+-------+
    | url | author | bookname | chubanshe | time_print | price |
    +-----+--------+----------+-----------+------------+-------+
    | aa  | bb     | c        | d         | e          | f     |
    +-----+--------+----------+-----------+------------+-------+

    五、接下来可以将url批量存入Excel,让python读取Excel中的url逐条将信息插入mysql

    先安装python的Excel读取库xlrd

    pip install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

    参考博文:https://www.cnblogs.com/insane-Mr-Li/p/9092619.html,还有写入Excel库xlwd。

    #tips:这里会报错:
    
    raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+'; not supported')
    xlrd.biffh.XLRDError: Excel xlsx file; not supported
    
    #原因是最近xlrd更新到了2.0.1版本,只支持.xls文件。所以xlrd.open_workbook(file)会报错。
    
    #可以安装旧版xlrd,在cmd中运行:
    
    pip uninstall xlrd
    pip install xlrd==1.2.0 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

    因当当的url格式为:http://product.dangdang.com/29140893.html,把其中的29140893当做url_id存入Excel

    # coding=utf-8
    import requests
    from lxml import etree
    import pymysql.cursors          # 导入数据库操作包
    import xlrd
    
    class book_detail(object):
        def __init__(self):
            self.conn = pymysql.connect(host='localhost', port=3306, user='root', password='****', db='pachong', charset='utf8')
            self.cursor = self.conn.cursor()
            self.sql_info="insert ignore into `dangdang_book` values(%s, %s, %s, %s, %s, %s)"   #连接数据库
    
    # 1.1爬取网页信息存入python的主体函数
        def get_detail(self,url_id):
            print(url_id)
            url = 'http://product.dangdang.com/'+url_id+'.html'
            headers = {
                    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                                  "Chrome/69.0.3497.81 Safari/537.36 Maxthon/5.3.8.2000 "
                }
            aa = requests.get(url,headers=headers)
            message = aa.content.decode('gbk')
            content = etree.HTML(message)                                 # message是str格式,需要先转成HTML格式
    
            # 1.2解析需要的文本信息
            try:
                if content.xpath('//*[@id="author"]/a[1]/text()'):  # 作者       # 运用xpath语法提取所需元素,如果不用.pop(),返回列表
                    author = content.xpath('//*[@id="author"]/a[1]/text()').pop()
                else:
                    author = 'none'
                if content.xpath('//*[@class="name_info"]/h1[1]/text()'):
                    book_name = content.xpath('//*[@class="name_info"]/h1[1]/text()').pop().strip()  # 书名
                # print(content.xpath('//*[@dd_name="大图"]/img/@src').pop())   # 图片
                else:
                    book_name = 'none'
                if content.xpath('//*[@dd_name="出版社"]/a/text()'):   # 出版社
                    chubanshe = content.xpath('//*[@dd_name="出版社"]/a/text()').pop()
                else:
                    chubanshe = 'none'
                if content.xpath('//*[@class="messbox_info"]/span[3]/text()'):
                    time_print = content.xpath('//*[@class="messbox_info"]/span[3]/text()').pop()  #出版时间
                else:
                    time_print = 'none'
                if content.xpath('//*[@class="price_info clearfix"]/div[2]/div/div/p[2]/text()'):
                    price = content.xpath('//*[@class="price_info clearfix"]/div[2]/div/div/p[2]/text()').pop()   # 价格
                else:
                    price = 'none'
                print("%s %s %s %s %s %s" %(url, author, book_name, chubanshe, time_print, price))
    
                # 1.3存入mysql
                self.cursor.execute(self.sql_info,(str(url),str(author),str(book_name),str(chubanshe),str(time_print),str(price)))
                self.conn.commit()
    
            except:
                pass
    # 2.1循环每个url
        def run(self):
            file=r"C:Users*********ook_detail_url.xlsx"
            data=xlrd.open_workbook(file)                                   #读取Excel文件
            sheet_table=data.sheets()[0]                                    #选择工作表sheet
            for j in range(sheet_table.nrows):                              #sheet_tables.nrows指sheet中数据行数
                try:
                    link_url=str(int((sheet_table.row_values(j)[0])))        #获取第j行第0列的值url_id
                    self.get_detail(link_url)                                #通过爬虫解析该url_id对应网页信息,并存入mysql
                except:
                    print(j+"error")
                    pass
    
    if __name__ == '__main__':
        ss=book_detail()
        ss.run()
    #这里我存入了几条Id,运行结果:
    mysql> select * from dangdang_book;G
    +-------------------------------------------+----------+-------------------------------------------------------+----------------------+----------------------+------------+
    | url                                       | author   | bookname                                              | chubanshe            | time_print           | price      |
    +-------------------------------------------+----------+-------------------------------------------------------+----------------------+----------------------+------------+
    | http://product.dangdang.com/29148702.html | 南派三叔 | 世界(南派三叔新书)                                       | 吉林文 史出版社          | 出版时间:2020年10月? | 28.10      |
    | http://product.dangdang.com/29168703.html | 曲一线   | 53随堂测小学语文四年级下册RJ人教版2021春季含参考答案         | 首都师 范大学出版社   | 出版时间:2020年12月? | 9.60       |
    | http://product.dangdang.com/29160079.html | 禹思琦   | 沙漠的高处,花雨漫天                                  | 作家出 版社           | 出版时间:2020年11月? | 25.90      |
    | http://product.dangdang.com/29164246.html | 许仲琳   | 封神演义(全2册)                                       | 北方文 艺出版社       | 出版时间:2020年10月? | 145.80     |
    | http://product.dangdang.com/29148770.html | 唧唧的猫 | 温柔有九分                                            | 江苏凤 凰文艺出版社   | 出版时间:2020年11月? | 30.00      |
    | http://product.dangdang.com/29140893.html | 樊登     | 樊登讲论语:学而(樊登重磅新作!)                    | 北京联 合出版有限公司 | 出版时间:2020年11月? | 49.70      |
    +-------------------------------------------+----------+-------------------------------------------------------+----------------------+----------------------+------------+
    6 rows in set (0.00 sec)
  • 相关阅读:
    grep命令详解
    Git命令详解(一)-个人使用
    android intent和intent action大全
    android 监控EditText的变化
    第86章、系统服务之TELEPHONY_SERVICE(从零开始学Android)
    android中getSystemService详解
    关于android各种双卡手机获取imei,imsi的处置(mtk,展讯,高通等)
    Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题
    Android 移动缩放的ImageView
    Android 读写SD卡的文件
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14129997.html
Copyright © 2011-2022 走看看