zoukankan      html  css  js  c++  java
  • 豆瓣读书爬虫(requests + re)

      

      前面整理了一些爬虫的内容,今天写一个小小的栗子,内容不深,大佬请忽略。内容包括对豆瓣读书网站中的书籍的基本信息进行爬取,并整理,便于我们快速了解每本书的中心。

    一、爬取信息

      每当爬取某个网页的信息时,首先就是要进入到网页中,看看有没有什么爬取过程中的限制,可以查看网站的robots协议。就是在原网址的后面加上"/robots.txt"。本网站中得到的结果是:

    User-agent: *
    Disallow: /subject_search
    Disallow: /search
    Disallow: /new_subject
    Disallow: /service/iframe
    Disallow: /j/
    Sitemap: http://www.douban.com/sitemap_index.xml
    Sitemap: http://www.douban.com/sitemap_updated_index.xml
    
    User-agent: Wandoujia Spider
    Disallow: /
    

      根据上面的协议可以看到,并没有禁止一些普通的爬虫,就像我们现在这样,仅仅爬取一点点的东西来供自己使用。那么,我们就可以使用之前文章中提到的结构来实现这个爬虫,首先导入函数库,然后套用框架,传入地址,返回页面内容。这点内容在这篇博客中写到了,这里就不详细解释了。到此,网页的爬取就结束了,接下来就剩下从这些东西中拿到我们想要的内容。

     1 import requests
     2 
     3 url = "https://book.douban.com/"
     4 def getHtmlText(url):
     5     headers = {
     6         'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
     7     }
     8     try:
     9         response = requests.get(url, headers=headers)
    10         response.raise_for_status()
    11         response.encoding = response.apparent_encoding
    12         return response.text
    13     except:
    14         print("Fail")
    15         return
    16     
    17 html = getHtmlText(url)

    二、信息处理

       上面提取的的网页代码包括很多东西,像展示出来的页面的各种框架等等,这些对我们来说都是没有用的,而且通过正则来提取信息,如果在整个页面中直接提取的话,不免会出现一些巧合,使得没有提取到真正想要的内容,而且pattern一样的其他内容,所以,首先,把要把关键的块先拿出来,再一点一点的取出具体信息。

    1 import re
    2 
    3 re_books = re.compile('<ul class="list-col list-col5 list-express slide-item">(.*?)</ul>', re.S)  # re.S也在正则表达式的博客中写到了,是为了让“.”可以匹配换行符
    4 content = re_books.search(html)

      通过检查网页源代码,找到可以取出主要信息的匹配规则,将中间的内容全部获得。剩下的就是通过正则来提取每本书的每项信息。这个在于自己观察他们的规律,寻找匹配的规则。信息的标签不止一个,最后选择了使用pandas来整理数据,pandas的DataFrame数据类型可以很方便的存储二维结构,而且pandas有将数据之间存储成excel格式的方法(DataFrame.to_excel())。

     1 import pandas as pd  # 这是大部分人的习惯,pandas比较长,而且在数据处理中经常使用,所以用pd两个字母来代表
     2 
     3 # 首先,先创建一个DataFrame,之后遍历每本书籍的信息,存成DataFrame格式拼接在他的后面就可以了
     4 data = pd.DataFrame(columns=['title', 'author', 'abstract', 'href', 'publisher'])
     5 
     6 re_book = re.compile('<li class="">(.*?)</li>', re.S)
     7 bookList = re_book.findall(content[0])  # findall找到所有的书籍信息,返回为列表格式
     8 for book in bookList:
     9     count = 0
    10     count += 1
    11     href = re.search('href="(.*?)"', book)  # .*? 是指以非贪婪的模式匹配,()是分组,通过group方便取出其中的信息
    12     href = href.group(1)
    13     title = re.search('<h4 class="title">(.*?)</h4>', book, re.S)
    14     title = title.group(1).split()[0]
    15     author = re.search('<span class="author">(.*?)</span>', book, re.S)
    16     author = ' '.join(author.group(1).split())
    17     publisher = re.search('<span class="publisher">(.*?)</span>', book, re.S)
    18     publisher = ' '.join(publisher.group(1).split())
    19     abstract = re.search('<p class="abstract">(.*?)</p>', book, re.S)
    20     abstract = ' '.join(abstract.group(1).split())
    21     abstract = re.sub('【内容简介】', '', abstract)  # 慢慢调试中发现,取得的信息不太好看,其中在第一本数的主要内容开头有这么几个字,就用re的sub方法替换掉了
    22     new = pd.DataFrame({"title":title, "author":author, "abstract":abstract, "href":href, "publisher":publisher}, index=["0"])
    23     data = data.append(new, ignore_index=True)
    24 data.to_excel('bookInfo.xls', encoding='utf-8')

      我们可以看一下得到的结果,pandas直接输出的结果也很规整,这里存储到了excel中,起初存到csv文件中,但是乱码了,后面没多想就换成了excel,稍后我再去看看怎么回事,或者有读者清楚地,可以教教博主。

      图中有些东西没有展示出来,但是大家都懂对吧。可以自己试一试。当然这个爬虫很浅,仅得到这点的数据,后面的内容就交给你们了,可以试着往深里点一点,原理都是大同小异的,学习爬虫在平时就要随时发现可以挖掘的东西,慢慢尝试。

    作者:渔单渠 微信搜索“小田学Python”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    leetcode Convert Sorted List to Binary Search Tree
    leetcode Convert Sorted Array to Binary Search Tree
    leetcode Binary Tree Level Order Traversal II
    leetcode Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
    证明中序遍历O(n)
    leetcode Maximum Depth of Binary Tree
    限制 button 在 3 秒内不可重复点击
    HTML 和 CSS 画三角形和画多边行基本原理及实践
    在线前端 JS 或 HTML 或 CSS 编写 Demo 处 JSbin 与 jsFiddle 比较
  • 原文地址:https://www.cnblogs.com/yudanqu/p/9863827.html
Copyright © 2011-2022 走看看