爬虫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)
原文地址:https://www.cnblogs.com/foolangirl/p/14129997.html