爬虫之获取当当网全部图书

#encoding:utf-8##author:wuhao#

#******

#爬取当当网图书,未使用框架

#main是主函数

#KindLinks.py和 获取数据信息.py 是2个封装的类

#KindLinks只有一个方法,它返回的是 listUrl---(name(小分类名称),url(小分类对应的链接)) LB---(总的分类)

#获取数据信息有2个方法,---getpage(),getinfo() getpage()返回的是页码数,getinfo()返回的是每本书中的信息(书名,评论数,作者,出版社,价格,出版日期) 书名我没有进行进一步的解析,可能比较杂乱



#当当网商品种类链接,获取不同种类的所有图书

from bs4 import BeautifulSoup

class _FirstPageLinkToGetUrl():
    def __init__(self,opener):
        self.opener=opener
        self.url="http://category.dangdang.com/?ref=www-0-C"

    def getDifferentSeriesBookUrl(self):
        html=self.opener.open(self.url).read().decode("gbk")

        soup=BeautifulSoup(html,"html.parser")
        #类别
        LB = []
        # 字典存储小类别对应的URL
        #dictUrl = {}
        #
        temp=0
        listUrl=[]
        count=[]
        #outside  ---外层的div
        #_li      ---li层
        for outsideDiv in soup.find("div", class_="classify_books", id="floor_1").find_all("div", class_="classify_kind"):
            LB.append(outsideDiv.div.a.string)
            temp=0
            dictUrl={}
            for _li in outsideDiv.find("ul").find_all("li"):
                if _li.a.string == "更多":
                    continue
                else:
                   # print(s.a.get("href"), s.a.string)
                    temp+=1
                    dictUrl[_li.a.string] = _li.a.get("href")
            count.append(temp)
            listUrl.append(dictUrl)
        return listUrl,LB
#获取网页中包含的图书的信息from bs4 import BeautifulSoup
import re
class _GetBookInfo():
    def __init__(self,opener):
        self.opener=opener

    def getPage(self,url):
        html = self.opener.open(url)
        html = html.read().decode("gbk")  # 网页数据
        with open("test.txt","w") as f:
            f.write(html)
        regex=re.compile("<span>/\d+</span>")
        valueNum=re.findall("\d+",regex.findall(html)[0])
        return int(valueNum[0])

    def getInfo(self,url):

        html = self.opener.open(url).read().decode("gbk")

        soup = BeautifulSoup(html,"html.parser")

        ulTag=soup.find("ul",class_="list_aa listimg",id=True)

        liTag=ulTag.find_all("li",id=True)

        data1=[]
        #遍历liTag
        temp=0
        for li in liTag:
            data = []
            try:
                data.append(li.find("p",class_="name").string)
                data.append(li.find("p",class_="star").a.string)
                data.append(li.find("p",class_="author").a.string)
                data.append(li.find("p",class_="publishing").a.string)
                data.append(li.find("p",class_="price").span.string)
                data.append(re.findall(r"/ .+ ",str(li.find("p", class_="publishing_time")))[0].replace(" ","").replace("/",""))
                data1.append(data)
            except:continue
        #print(data)
        return data1

#
‘‘‘
    def getDifferentSeriesBookUrl(self):
        html=self.opener.open(self.url).read().decode("gbk")

        soup=BeautifulSoup(html)
        #类别
        LB = []
        # 字典存储小类别对应的URL
        dictUrl = {}
        #outside  ---外层的div
        #_li      ---li层
        for outsideDiv in soup.find("div", class_="classify_books", id="floor_1").find_all("div", class_="classify_kind"):
            LB.append(outsideDiv.div.a.string)
            for _li in outsideDiv.find("ul").find_all("li"):
                if _li.a.string == "更多":
                    continue
                else:
                   # print(s.a.get("href"), s.a.string)
                    dictUrl[_li.a.string] = _li.a.get("href")

        return dictUrl,LB
‘‘‘
#-encoding:utf-8
from 当当网图书爬取 import 获取数据信息 as bookInfo
from 当当网图书爬取 import KindLinks as kls
from bs4 import BeautifulSoup
import urllib.request
import urllib.parse
import http.cookiejar
import re
import xlwt
import xlrd

def getCorrectUrl(url,page):
    if page==0:  return url
    url=url.replace("m/","m/pg"+str(page)+"-")
    return url

#url,当当网所有商品网页
url="http://category.dangdang.com/?ref=www-0-C"
#创建实例化对象
Cookie=http.cookiejar.CookieJar()
#创建处理器
CookieHandle=urllib.request.HTTPCookieProcessor(Cookie)
#创建opener
opener=urllib.request.build_opener(CookieHandle)
#模拟浏览器登录
header=    {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
    }
head=[]
for key,value in header.items():
    elem=(key,value)
    head.append(elem)
opener.addheaders=head
#打开一次网页让opener具备Cookie
opener.open(url)

#首先获取相关链接从KindLinks
_kls=kls._FirstPageLinkToGetUrl(opener)
#书籍的链接数据
bdata=_kls.getDifferentSeriesBookUrl()

bdata_url=bdata[0]          #包含所有需要用的url
bdata_gd=bdata[1]           #大体描述
#bdata_count=bdata[2]        #每取出多少个url,创建一个表格
#把字典转换为list存储
bdata_url_name=[]
bdata_url_url=[]
print((list(bdata_url[0].values())))
for key in range(len(bdata_url)):
    bdata_url_url.append(list(bdata_url[key].values()))
    bdata_url_name.append(list(bdata_url[key].keys()))
print(bdata_url_name)
print(bdata_url_url[0])
#实例化对象
bio=bookInfo._GetBookInfo(opener)
#在excel中存储的格式
StyleinfoInExcel=["书名","评论数","作者","出版社","价格","出版日期"]
book=xlwt.Workbook(encoding="utf-8")
#用于统计总计书的数量
count=0

for _gd in range(len(bdata_url)):
    for _bdata in range(len(bdata_url_name[_gd])):
        page = bio.getPage(bdata_url_url[_gd][_bdata])           #获取页码数
        sheetname=bdata_url_name[_gd][_bdata].replace("/", "-")
        try:
            sheet=book.add_sheet(sheetname=sheetname)
        except:continue
        print(sheetname+"正在写入...")
        for i in range(len(StyleinfoInExcel)):
            sheet.write(0,i,StyleinfoInExcel[i])
        #进行数据的读取和写入
        temp=0
        for CurrentPage in range(1,page,1):                                             #CurrentPage为实际爬取到的网页页码
            try:
                data=bio.getInfo(getCorrectUrl(bdata_url_url[_gd][_bdata],CurrentPage))          #数据保存到data中
                #将数据写入到Excel
                for i in range(len(data)):
                    temp+=1
                    for j in range (len(data[i])):
                        #print(data[i][j],end=" ")
                        sheet.write(temp,j,data[i][j])
                    count+=1
            except:continue
        print("已写入"+str(count)+"本书")
        print(sheetname+"写入完成...\r\n")

        if _bdata==len(bdata_url_name[_gd])-1:
            book.save(bdata_gd[_gd].replace("/","-")+".xls")
            book = xlwt.Workbook(encoding="utf-8")
            print("--------已完成"+bdata_gd[_gd])
        #
print("写入完成,共计"+str(count)+"本书")


  

时间: 2024-12-24 22:02:58

爬虫之获取当当网全部图书的相关文章

爬取当当网的图书信息之工作流程介绍

前往http://book.dangdang.com/我们可以看到当当网上面的图书种类非常丰富 我们是计算机类图书为例子,那么计算机类图书页面的URL  http://book.dangdang.com/01.54.htm?ref=book-01-A是我们的种子URL 当我们进入这个页面可以看到很多计算机类图书,什么都别说了,都抓取下来,然后在进入子品类页面继续抓取信息,我们以程序涉及品类为例 进来之后我们可以看到大量的图书,而且在页面上方我们可以看到100页,可不止这么一点还有99页没有显示出

爬取当当网的图书信息之结尾

由于当当网上的图书信息很丰富,全部抓取下来工作量很大.只抓取其中的一类 在Main()方法里面 首先用户输入种子URL string starturl = Console.ReadLine(); 构建数据库上下文对象 BookStoreEntities storeDB = new BookStoreEntities(); 获取图书类的URL string html = Tool.GetHtml(starturl); ArrayList list = new ArrayList(); list =

爬取当当网的图书信息之导读

什么是爬虫 爬虫是用来抓取互联网上信息的程序.程序员可以利用爬虫来干很多事,有些挺酷炫,这里贴出知乎相关问题的网址https://www.zhihu.com/question/29372574 爬虫的工作流程 主要的分三步走,第一步把网页下载下来,第二步抽取认为有用的信息,第三步将相关信息保存下来.看是不是很简单嗯. 前期技术储备 1.如何把网页下载下来? 这里我们使用相关的library模拟人使用浏览器对服务器发送请求,然后获得相关网页的源代码.我使用C#语言编程,采用封装强度最高的最简单的W

爬取当当网的图书信息之封装一个工具类

把这个类名取为Tool 封装一个下载网页的方法GetHtml public static string GetHtml(string url) { try { WebClient wb = new WebClient(); return wb.DownloadString(url); } catch { return ""; } } 传入的是这个网页的URL,这个方法能帮我们把网页下载下来封装一个匹配图书类URL的的方法 public static ArrayList GetList(

爬取当当网的图书信息之实体设计

首先新建一个控制台应用程序WebSpider 这里我选用控制台应用程序,使用控制台非常简单,为了方便监控把抓取到的一些信息给打印出来. 实体设计 BookClass public int BookClassId { get; set; } public string BookClassName { get; set; } public string Url { get; set; } public int Pages { get; set; } public virtual List<Book>

Scrapy爬虫(5)爬取当当网图书畅销榜

??本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下: ??我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲,可以参考上一篇博客,我们只需要修改items.py文件,以及新建一个爬虫文件BookSpider.py. ??items.py文件的代码如下,用来储存每本书的排名,书名,作者,出版社,价格以及评论数. import scrapy class BookspiderItem(scrapy.Item):

Python爬虫库Scrapy入门1--爬取当当网商品数据

1.关于scrapy库的介绍,可以查看其官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/ 2.安装:pip install scrapy  注意这个库的运行需要pywin32的支持,因此还需要安装pywin32.可以在这个网站上选择合适的版本下载安装:https://sourceforge.net/projects/pywin32/files/pywin32/ 3.挖掘当当网商品数据: 首先需要创建一个名为dangdang的爬虫项目,在pow

scrapy爬取当当网

春节已经临近了尾声,也该收收心了.博客好久都没更新了,自己在年前写的爬虫也该“拿”出来了. 本次爬取的目标是当当网,获取当当网所有的书籍信息.采用scrapy+mongodb来采集存储数据.开干! 起始url: start_urls = ['http://category.dangdang.com/cp01.00.00.00.00.00-shlist.html'] 当当书籍的一级分类二级分类都很明显的展示了出来. ok~入口找到了,当当网也没有设置反爬措施,所以可以直接的放心爬取,如果需要大规模

java爬虫,爬取当当网数据

 背景:女票快毕业了(没错!我是有女票的!!!),写论文,主题是儿童性教育,查看儿童性教育绘本数据死活找不到,没办法,就去当当网查询下数据,但是数据怎么弄下来呢,首先想到用Python,但是不会!!百度一番,最终决定还是用java大法爬虫,毕竟java熟悉点,话不多说,开工!: 实现: 首先搭建框架,创建一个maven项目,使用框架是springboot和mybatis,开发工具是idea,pom.xml如下: <?xml version="1.0" encoding="