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”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    What difference between sharepoint web parts and User Controls?
    Backup and Restore in SharePoint 2010
    AJAX 工作原理
    What difference between site definition and site templates?
    Webpart 通信:通过Web Part Connection 在Web Part 之间传递数据(一)
    如何设置zencart能使网店更安全?
    Win7 64bit下安装Moss2010问题总结
    SharePoint配置和自定义Content Query Web Part
    html 自动换行
    ASP.NET 包含几大对象
  • 原文地址:https://www.cnblogs.com/yudanqu/p/9863827.html
Copyright © 2011-2022 走看看