python爬虫——获取豆瓣评分图书

写在前面

本试验通过python爬虫来获取豆瓣评分靠前的图书并下载图书封面。

本试验项目代码部分均参考Sunnnnnnnnyin的python:网络爬虫入门经验总结大大大大全一文。

配置环境为python v3.6.1。

  • 写在前面
  • 思路整理
    • step1downLoadBook对当前页面操作
        • 实验代码
    • step2翻页

思路整理

完成一项工作,首先是要分步骤。

这句话听得多,但是在实际应用却往往忽视,像无头苍蝇到处乱撞。作为一个零项目经验的程序猿,在学习了Sunnnnnnnnyin的博客之后才认识到这个梳理思路的重要性。通过程序来完成一系列的操作本质就是人为设定好运行思路,再通过计算机强大的运算能力来优化和重复自己认为单调或复杂的工作。


小说这一标签为例,完成该项试验可分为两大步。

  1. 读取并判断当前页面书籍评分情况,完成下载
  2. 翻页

step1:downLoadBook——对当前页面操作

首先解析当前页面的源码,分析每一本书对应的模块区域,以及后续我们所需要捕获的’score’,’imag’,’bookname’等信息分布在哪些地方。

  <li class="subject-item">
    <div class="pic">
      <a class="nbg" href="https://book.douban.com/subject/25862578/" 
  onclick="moreurl(this,{i:'0',query:'',subject_id:'25862578',from:'book_subject_search'})">
        <img class="" src="https://img3.doubanio.com/mpic/s27264181.jpg"
          width="90">
      a>
    div>
    <div class="info">
      <h2 class="">


  <a href="https://book.douban.com/subject/25862578/" title="解忧杂货店" 
  onclick="moreurl(this,{i:'0',query:'',subject_id:'25862578',from:'book_subject_search'})">

    解忧杂货店




  a>

      h2>
      <div class="pub">


  [日] 东野圭吾 / 李盈春 / 南海出版公司 / 2014-5 / 39.50元

      div>






  <div class="star clearfix">
        <span class="allstar45">span>
        <span class="rating_nums">8.6span>

    <span class="pl">
        (226511人评价)
    span>
  div>







    <p>现代人内心流失的东西,这家杂货店能帮你找回——
僻静的街道旁有一家杂货店,只要写下烦恼投进卷帘门的投信口,第二天就会在店后的牛奶箱里得到回答。
因男友身患绝... p>






      <div class="ft">

  <div class="collect-info">
  div>


          <div class="cart-actions">

              <span class="market-info">
                <a href="https://book.douban.com/subject/25862578/?channel=subject_list&platform=web" target="_blank">在豆瓣购买a>
              span>
          div>






  <div class="ebook-link">
    <a target="_blank" href="https://read.douban.com/ebook/36103930/?dcs=tag-buylink&dcm=douban&dct=25862578">去看电子版a>
  div>



      div>

    div>
  li>

从这段代码可以看出每本书:

  1. 开始——标签li属性class=subject-item
  2. 封面图片——标签img属性src
  3. 评分——标签span属性class=rating_nums
  4. 书名——标签a属性为title=****

解析html文本可以采用BeautifulSoup库,捕获并提取相应标签下内容。

实验代码

def downLoadBook(url, savepath):
    soup = BeautifulSoup(urlopen(url), 'html.parser')
    content = soup.find("div", {"id":"subject_list"}).find_all("li",{"class":"subject-item"})
    for link in content:
        score = link.find('span', {'class':'rating_nums'}).get_text()
        if float(score) >= 9.0 :
            imagurl = link.find('img')['src']
            bookname = link.find('a', title=re.compile(r'^.*$'))['title']
            urlretrieve(imagurl, savepath+'%s.jpg' %bookname)

说明

#在获取书名的时候,为了匹配title后的输入,采用了正则表达式模块re.compile(r'^.*$')来匹配书名

step2:翻页

每一页都对应了一个url,观察发现每个url之间只有数字发生变化。

def nextPage(rawurl,tag):
    global booklink
    pagenum = [x * 20 for x in range(100)]
    rawUrlNet = urlparse(rawurl).netloc
    rawUrlScheme = urlparse(rawurl).scheme  # 头
    bookLinks = []
    for item in pagenum:
        url = rawUrlScheme + "://" + rawUrlNet + "/tag/" + tag + "?start=" + str(item) + "&type=T"
        booklink.append(url)
    return booklink

有一点需要说明。

#url解析时是不能带有中文字体,而本次爬取的网址中明显带有中文路径。这里需要调用urllib.request库的quote模块,将中文内容编码。

你可能感兴趣的:(python3,爬虫)