当当图书信息爬取

效果:

分析:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

version_0

声明:未经许可,不能作为商业用途

总结:通过//div[@class="xxx"]可能取到的数据是不全面的,这时候不妨考虑使用//div[contains(@calss,'xxx')]的方式来提取

   如果通过re模块去提取数据,在首页(book.dangdang.com/index)取获取分类信息的时候,会提示errordecode,

   这是因为当当图书在网页中插入了别国字符导致编码不统一的问题。

   当当网在获取图书信息,翻页时,未采用任何动态技术,通过价格也是直接嵌入在网页上的,这个就比较容易获取到。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

源码

# -*- coding: utf-8 -*-
import scrapy
import re
from copy import deepcopy
from pprint import pprint
from urllib import parse


class DdtsSpider(scrapy.Spider):
    name = 'ddts'
    allowed_domains = ['dangdang.com']
    start_urls = ['http://book.dangdang.com/index']

    def process_info(self,con_list):
        """传入一个列表,处理空字符串并将字段拼接在一起"""
        con_list = [re.sub(r"\s|\n", '', i).strip() for i in con_list if i]
        s = str()
        for a_ in con_list:
            s += a_
        return s

    def parse(self, response):
        div_cate_list = response.xpath("//div[@class='con flq_body']//div[contains(@class,'level_one')]")
        # 去掉空字符串,去掉当当出版
        div_cate_list = div_cate_list[2:13]+div_cate_list[14:-4]
        for div_cate in div_cate_list:
            item = dict()
            # 获取大分类标题
            #   提取标题部分
            item["b_cate"] = div_cate.xpath(".//dl[contains(@class,'primary_dl')]/dt//text()").extract()
            item["b_cate"] = self.process_info(item["b_cate"])
            # 拿到所有弹出层列表
            t_list = div_cate.xpath(".//dl[contains(@class,'inner_dl')]")
            for t in t_list:
                # 获取中级标题
                item["m_cate"] = t.xpath(".//dt//text()").extract()
                item["m_cate"] = self.process_info(item["m_cate"])
                # 获取小分类及地址
                a_list = t.xpath(".//dd/a")
                for a in a_list:
                    item["s_cate"] = a.xpath("./text()").extract()
                    item["s_cate"] = self.process_info(item["s_cate"])
                    s_href = a.xpath("./@href").extract_first()
                    # 请求小分类的地址
                    yield scrapy.Request(
                        url = s_href,
                        callback=self.parse_s_cate,
                        meta={"item":deepcopy(item)}
                    )

    def parse_s_cate(self,response):
        item = deepcopy(response.meta["item"])
        # 选取图书列表
        book_li_list = response.xpath("//div[contains(@id,'search_nature_rg')]/ul[contains(@class,'bigimg')]/li")
        # 当前请求的url包含该页面下所有的请求,无任何动态加载
        for book_li in book_li_list:
            book_info = dict()
            book_info["title"] = book_li.xpath(".//p[contains(@class,'name')]//a/@title").extract()
            book_info["title"] = self.process_info(book_info["title"])
            book_info["href"] = book_li.xpath(".//p[contains(@class,'name')]//a/@href").extract_first()
            book_info["price"] = book_li.xpath(".//p[contains(@class,'price')]//span[contains(@class,'earch_now_price')]/text()").extract_first()
            book_info["price"] = book_info["price"].split(r";",1)[-1]
            book_info["author"] = book_li.xpath(".//a[contains(@name,'itemlist-author')]/text()").extract_first()
            book_info["press"] = book_li.xpath(".//a[contains(@name,'P_cbs')]/text()").extract_first()
            book_info["description"] = book_li.xpath(".//p[contains(@class,'detail')]//text()").extract_first()
            item["book_info"] = book_info
            pprint(item)
        url = response.xpath("//li[@class='next']/a/@href").extract_first()
        if url is not None:
            next_url = parse.urljoin(response.url,url)
            yield scrapy.Request(
                url=next_url,
                callback=self.parse_s_cate,
                meta={"item":response.meta["item"]}
            )
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供Python爬取当当图书信息并存到CSV文件的代码示例。您可以按照以下步骤操作: 1. 安装所需库:requests、BeautifulSoup、csv ``` pip install requests pip install beautifulsoup4 ``` 2. 编写代码: ```python import requests from bs4 import BeautifulSoup import csv # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 要爬取当当图书网址 url = 'http://search.dangdang.com/?key=python&act=input&page_index=' # 存储结果的CSV文件名 filename = 'books.csv' # 打开CSV文件,以写入模式写入数据 with open(filename, 'w', newline='', encoding='utf-8') as csvfile: # 设置CSV文件的列名 fieldnames = ['书名', '作者', '价格', '出版社', 'ISBN'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 爬取5页数据 for i in range(1, 6): # 构造当页的URL cur_url = url + str(i) # 发送请求,获取响应 response = requests.get(cur_url, headers=headers) # 解析HTML页面 soup = BeautifulSoup(response.text, 'html.parser') # 获取所有图书信息 items = soup.select('.bigimg > ul > li') # 循环遍历每一本图书,提取信息并写入CSV文件 for item in items: title = item.select('.name > a')[0].text.strip() author = item.select('.publisher_info')[0].text.strip().split('/')[0] price = item.select('.price > p > span')[0].text.strip() publisher = item.select('.publisher_info')[0].text.strip().split('/')[-3] isbn = item.select('.publisher_info')[0].text.strip().split('/')[-1] writer.writerow({'书名': title, '作者': author, '价格': price, '出版社': publisher, 'ISBN': isbn}) print('爬取完成!') ``` 3. 运行代码,等待爬取完成。爬取完成后,您可以在当目录下找到名为“books.csv”的CSV文件,其中包含爬取到的当当图书信息。 希望这个代码示例对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值