豆瓣爬取图书标签

这是我第一个全程自己动手做的项目,算得上是中小型的吧。网上看到好多关于python爬虫的项目,说是找工作必会,但我都感觉有些难。最后不管三七二十一,试试再说,做不出来也不会损失什么。于是选了一个豆瓣图书标签爬取的项目,github(用过好多次了,但不太了解,感觉就是一个让程序员分享成果的一个平台)上有源代码,但是没有一句注释。

终于,我花了两天的时间给整出来了,感觉非常欣慰,没想到会这么快。以前看视频学习都得两天才能大致了解一个项目,可能是现在自己的知识储备积累多了吧^_^

最重要的是,通过自己做项目,能够弥补好多以前自己不扎实的基本功,比如正则表达式,urllib, BeautifulSoup, MongoDB,以前都是跟着视频做项目使用过,也全面讲解过,但没有自己动手练习,非常的不熟练。还有对于如何存储到Excel, 如何使存储到excel中的标签按顺序排列,都是通过这个项目学到的。

不费话了,进入正题,这个项目要求是:1. 从豆瓣爬取相关图书标签; 2. 将不同种类的图书列为几个不同的列表,将各自种类的图书标签存进去; 3. 没有IP代理池,采用了延时的笨方法。

直接上代码:

import requests
import re
import xlwt
import time
import random
from requests.exceptions import RequestException

def do_spider(book_tag_lists):
    book_lists=[]
    for book_tag in book_tag_lists:
        book_list=book_spider(book_tag)
        book_lists.append(book_list)
    return book_lists

def book_spider(book_tag):
    page_num = 0
    book_list = []
    try_times = 0
    while (page_num<10):
        url = ‘https://book.douban.com/tag/‘+ book_tag + ‘?start=‘+ str(page_num * 20)
        time.sleep(random.uniform(0,3))  # 0 到 5 之间的随机浮点数
        # time.sleep(random.randint(0,5))  0 到 5 之间的随机整数,包括0,5
        try:
            headers = {
                ‘user-agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘,
                ‘Accept - Language‘: ‘zh - CN, zh;q = 0.9‘
            }  # 加上headers,网站认为是浏览器访问,就能爬取
            response = requests.get(url, headers=headers)
            if response.text:                 # 这5行代码是为了爬取每种类型的所有得书使用的
                response_text = response.text
            else:
                try_times+=1
                continue
        except RequestException:
            return None

        # if try_times > 200:break   # 在这儿使用了while (page_num<10)来退出

        pattern = re.compile(‘<li.*?<a.*?title="(.*?)".*?<div.*?pub">(.*?)</div>.*?‘
                             ‘"rating_nums">(.*?)</span>.*?</li>‘, re.S)
        items = re.findall(pattern, response_text)   # 从网页中提取相关的标签
        for item in items:
            other = item[1].strip()
            other_2 = other.split(‘/‘)  # 把字符串通过‘/‘符号拆分为一个列表
            title = item[0]
            author = other_2[0].strip()
            date = other_2[-2].strip()
            rating_nums = item[2]
            print(title,author,date,rating_nums)
            book_list.append([title, author, date, rating_nums])
            try_times = 0
        page_num += 1
        print(‘Downloading Information From Page_‘ + str(page_num))
    return book_list

# 将爬取得内容写到Excel中
def print_book_list_excel(book_lists, book_tag_lists):
    wb = xlwt.Workbook(encoding=‘utf-8‘)
    for i in range(len(book_tag_lists)):
        ws = wb.add_sheet(book_tag_lists[i])
        ws.write(0, 1, ‘标题‘)
        ws.write(0, 2, ‘作者‘)
        ws.write(0, 3, ‘出版日期‘)
        ws.write(0, 4, ‘评分‘)
        count = 0
        for bl in book_lists[i]:
            count+=1
            ws.write(count,0,count)
            for j in range(4):
                ws.write(count,j+1,bl[j])
    wb.save(‘excel.xls‘)

def main():
    book_tag_lists = [‘小说‘,‘漫画‘,‘历史‘,‘经济学‘,‘互联网‘]
    book_lists = do_spider(book_tag_lists) # 已经调用过book_spider了
    print_book_list_excel(book_lists,book_tag_lists)

if __name__ == ‘__main__‘:
    main()

项目制作流程:1.先按照以前的经验,爬取了“小说”的10页图书标签,并写在文本文档中。(中间遇到许多挫折,尤其是正则表达式这块)

       2. 文本文档的内容不是按照“标题”、“作者”、“出版日期”、“评分”的顺序来排列的,而是乱序(因为for循环从字典中读数据本来就是乱序)。

        于是看了下载的代码,采用了 book_list.append([title, author, date, rating_nums]) 来代替字典形式(因为for循环从列表中读数据是按顺序来的)。

       3. 将其写入Excel表格,先用了下载的代码方法,不管用,只有sheet表格,没有写入的内容。网上查了一些方法,结合下载的代码,就实现了。

       4. 最后改写代码为每个种类的图书建一个sheet表格。

原文地址:https://www.cnblogs.com/zhangguoxv/p/10061817.html

时间: 2024-11-06 12:33:28

豆瓣爬取图书标签的相关文章

到豆瓣爬取电影信息

初学puthon爬虫,于是自己怕了豆瓣以电影信息,直接上源码 import re import requests from bs4 import BeautifulSoup import urllib import os class movie: def __init__(self): self.url="https://movie.douban.com/subject/25933890/?tag=%E7%83%AD%E9%97%A8&from=gaia_video" self

crawler碎碎念5 豆瓣爬取操作之登录练习

import requests import html5lib import re from bs4 import BeautifulSoup s = requests.Session() url_login = 'http://accounts.douban.com/login' url_contacts = 'https://www.douban.com/people/****/contacts' formdata = { 'redir':'https://www.douban.com',

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

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

Scrapy 通过登录的方式爬取豆瓣影评数据

Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来比较简单,主要分为以下几步: 1.创建一个项目 ==scrapy startproject Douban 得到一个项目目录如下: ├── Douban │   ├── init.py │   ├── items.py │   ├── pipelines.py │   ├── settings.py

Python爬虫入门教程: All IT eBooks多线程爬取

All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着,是的,就这么放着.......然后慢慢的遗忘掉..... All IT eBooks多线程爬取-爬虫分析 打开网址 http://www.allitebooks.com/ 发现特别清晰的小页面,一看就好爬 在点击一本图书进入,发现下载的小链接也很明显的展示在了我们面前,小激动一把,这么清晰无广告的

Python爬虫入门教程 14-100 All IT eBooks多线程爬取

1.All IT eBooks多线程-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着,是的,就这么放着.......然后慢慢的遗忘掉..... All IT eBooks多线程-爬虫分析 打开网址 http://www.allitebooks.com/ 发现特别清晰的小页面,一看就好爬 在点击一本图书进入,发现下载的小链接也很明显的展示在了我们面前,小激动一把,这么清晰无广告的网站

多线程爬取笔趣阁免费小说全站爬取

import threading,os,time,requests,pymongo,refrom queue import Queuefrom lxml import etreefrom bs4 import BeautifulSoup as BPclient = pymongo.MongoClient(host='localhost',port=27017)mg = client['biquge']def get_fenlei(): """ 爬取图书全部分类 :return

爬取福州地区职位数据

从网页源代码中找到我们需要爬取的标签且是html结构,爬取目标为class=’job_titile'和class='job_content' import requests from bs4 import BeautifulSoup import bs4 import pandas as pd #引用工具 url = 'http://fj.huatu.com/zt/2019zwb/diqu/1.html' def job(s):#定义函数 try: headers = {'User-Agent'

Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(str(i) for i in range(0, 226, 25))] 2.模块 requests获取网页源代码 lxml 解析网页 xpath提取 3.提取信息 4.可以封装成函数 此处没有封装调用 python代码: #coding:utf-8 import sys reload(sys) sys.