也可以存入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)