廖雪峰爬虫第八节

字符串和 dic list转换

import json

# 1.字符串和 dic list转换

# 字符串(json)----dict list----.loads
data = '[{"name":"张三","age":20},{"name":"李四","age":18}]'
print(data)
list_data = json.loads(data)
print(list_data)
# dict list ---字符串----.dumps
list2 = [{"name": "张三", "age": 20}, {"name": "李四", "age": 18}]
data_json = json.dumps(list2)
print(data_json)

读取、写入json文件


import json
# dict list  写入文件
list2 = [{"name": "张三", "age": 20}, {"name": "李四", "age": 18}]
# fp 是 file path
fp = open('02new.json', 'w')
json.dump(list2, fp)
fp.close()


# 读取文件json -----list dict
fp = open('02new.json', 'r')
resulst = json.load(fp)

print(resulst)

json 中的数据 转换 成 csv文件

import json
import csv

# 需求 json 中的数据 转换  成 csv文件

# 1.分别 读 , 创建文件
json_fp = open('02new.json', 'r',encoding='utf-8')
csv_fp = open('03csv.csv', 'w',encoding='utf-8')

# 2.提出 表头 , 表内容
data_list = json.load(json_fp)

sheet_title = data_list[0].keys()
print(sheet_title)


sheet_data = []
for data in data_list:
    sheet_data.append(data.values())
print(sheet_data)
# 3. csv 写入器
writer = csv.writer(csv_fp)

# 4. 写入表头
writer.writerow(sheet_title)
# 5. 写入内容
writer.writerows(sheet_data)

# 6. 关闭两个文件
json_fp.close()
csv_fp.close()

案例(电子书网站)

电子书网站地址

import requests
from lxml import etree
from bs4 import BeautifulSoup
import json


class BookSpider(object):
    def __init__(self):
        self.base_url = 'http://www.allitebooks.com/page/{}'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}

        self.data_list = []

    # 1.构建所有url
    def get_url_list(self):
        url_list = []
        for i in range(1, 10):
            url = self.base_url.format(i)

            url_list.append(url)

        return url_list

    # 2.发请求
    def send_request(self, url):
        data = requests.get(url, headers=self.headers).content.decode()
        print(url)
        return data

    # 3.解析数据 xpath
    def parse_xpath_data(self, data):
        parse_data = etree.HTML(data)

        # 1.解析出所有的书 book
        book_list = parse_data.xpath('//div[@class="main-content-inner clearfix"]/article')

        # 2.解析出 每本书的 信息
        for book in book_list:
            book_dict = {}
            # 1.书名字
            book_dict['book_name'] = book.xpath('.//h2[@class="entry-title"]//text()')[0]

            # 2.书的图片url
            book_dict['book_img_url'] = book.xpath('div[@class="entry-thumbnail hover-thumb"]/a/img/@src')[0]

            # 3.书的作者
            book_dict['book_author'] = book.xpath('.//h5[@class="entry-author"]//text()')[0]

            # 4.书的简介
            book_dict['book_info'] = book.xpath('.//div[@class="entry-summary"]/p/text()')[0]

            self.data_list.append(book_dict)

    def parse_bs4_data(self, data):

        bs4_data = BeautifulSoup(data, 'lxml')
        # 1.取出所有的书
        book_list = bs4_data.select('article')
        # print(book_list)



        # 2.解析出 每本书的 信息
        for book in book_list:
            book_dict = {}
            # 1.书名字
            book_dict['book_name'] = book.select_one('.entry-title').get_text()

            # # 2.书的图片url
            book_dict['book_img_url'] = book.select_one('.attachment-post-thumbnail').get('src')

            # # 3.书的作者
            book_dict['book_author'] = book.select_one('.entry-author').get_text()[3:]
            #
            # # 4.书的简介
            book_dict['book_info'] = book.select_one('.entry-summary p').get_text()
            print(book_dict)
            self.data_list.append(book_dict)

    # 4.保存数据
    def save_data(self):
        json.dump(self.data_list, open("04book.json", 'w'))

    # 统筹调用
    def start(self):

        url_list = self.get_url_list()

        # 循环遍历发送请求
        for url in url_list:
            data = self.send_request(url)
            # self.parse_xpath_data(data)
            self.parse_bs4_data(data)

        self.save_data()


BookSpider().start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sparky*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值