Python爬虫 || 使用requests和xpath爬取豆瓣Top250书单内容全解。

昨天,我们了解了如何爬取豆瓣某一个电影固定的位置信息,包含电影名称、导演、演员及评分等,今天我们来了解一下如何爬取豆瓣Top250书单,并如何将爬取到的内容存放到本地。

废话不多说了,shou my code!

# 爬取豆瓣TOP150
import requests # 导入相关的包
from lxml import etree
import time
import xlwt # 导入此包,可以将抓取的内容保存到本地

with open(r'C:\Users\Administrator\Desktop\TOP250.csv','w',encoding='utf-8') as f: # 在桌面上创建一个TOP250的CSV文件,文件以写入形式,字符集转化utf-8,linux系统则可省略utf-8
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
    } # 模拟请求头

    for a in range(10): # 共抓取10个网页的信息
        url = 'https://book.douban.com/top250?start={}'.format(a*25) # 在URL中创建一个循环。
        data = requests.get(url,headers = headers).text # 以text的形式 抓取到数据

# 网页xpath的分析过程
# //*[@id="content"]/div/div[1]/div/table[1] # 第一本书整体信息 赋值变量file
# //*[@id="content"]/div/div[1]/div/table[2] # 第二本书整体信息

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a 第一本书的名称位置 需要去掉恶心的tbody 赋值变量title
# //*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a 第二本书的名称位置 需要去掉恶心的tbody

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[2]/span[2] 第一本书的评分信息 需要去掉恶心的tbody 赋值变量score
# //*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[2]/span[2] 第二本书的评分信息 需要去掉恶心的tbody

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a   第一本书的href链接信息 需要去掉恶心的tbody

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[2]/span[3]  第一本书的评价人数 需要去掉恶心的tbody

# //*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/p[2]/span 第一本书的描述信息

    # //*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title
    # //*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title

        s = etree.HTML(data) # 将数据处理成可解析的形式
        file = s.xpath('//*[@id="content"]/div/div[1]/div/table') # 获取整本书的通用的位置代码

        for div in file:
            title = div.xpath("./tr/td[2]/div[1]/a/@title")[0] # 通过分析,正本书与各分页里面,可以看到前面部分(table)的代码是一样的,不同的是后面部分的代码。
            score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0] # 后面的[0]表示,取列表当中的第一个元素,其实列表中也就仅有一个元素,这个是列表的访问中的基础知识。
            herf = div.xpath("./tr/td[2]/div[1]/a/@href")[0] #  链接信息
            num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")") # 此处的strip是去掉爬取当中的无用信息,比如括号或者是空格之类的,看上去很恶心
            scribe = div.xpath("./tr/td[2]/p[2]/span/text()")
            time.sleep(1)
            if len(scribe)>0: # 加入对scribe长度的判断,部分书是没有scribe的信息的。
                print("正在下载...")
                print("{},{},{},{},{}".format(title,score,herf,scribe[0],num,))
                f.write("{},{},{},{},{}".format(title,score,herf,scribe[0],num,))
            else:
                print("正在下载...")
                print("{},{},{},{}".format(title,score,herf,num))
                f.write("{},{},{},{}".format(title,score,herf,num))

# 这样,我们只能爬取某一页面的信息,我们想要爬取所有的页面信息,需要分析一下每一页的规律
# https://book.douban.com/top250?start=0
# https://book.douban.com/top250?start=25
# https://book.douban.com/top250?start=50 所以,我们在刚开始的时候,对url创建一个for循环。

代码当中加入了对xpath的分析过程,所以看的比价凌乱,我们将解析部分的内容去掉,结果如下:

# 爬取豆瓣TOP150
import requests # 导入相关的包
from lxml import etree
import time
import xlwt # 导入此包,可以将抓取的内容保存到本地

with open(r'C:\Users\Administrator\Desktop\TOP250.csv','w',encoding='utf-8') as f: # 在桌面上创建一个TOP250的CSV文件,文件以写入形式,字符集转化utf-8,linux系统则可省略utf-8
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
    } # 模拟请求头

    for a in range(10): # 共抓取10个网页的信息
        url = 'https://book.douban.com/top250?start={}'.format(a*25) # 在URL中创建一个循环。
        data = requests.get(url,headers = headers).text # 以text的形式 抓取到数据

        s = etree.HTML(data) # 将数据处理成可解析的形式
        file = s.xpath('//*[@id="content"]/div/div[1]/div/table') # 获取整本书的通用的位置代码

        for div in file:
            title = div.xpath("./tr/td[2]/div[1]/a/@title")[0] # 通过分析,正本书与各分页里面,可以看到前面部分(table)的代码是一样的,不同的是后面部分的代码。
            score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0] # 后面的[0]表示,取列表当中的第一个元素,其实列表中也就仅有一个元素,这个是列表的访问中的基础知识。
            herf = div.xpath("./tr/td[2]/div[1]/a/@href")[0] #  链接信息
            num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")") # 此处的strip是去掉爬取当中的无用信息,比如括号或者是空格之类的,看上去很恶心
            scribe = div.xpath("./tr/td[2]/p[2]/span/text()")
            time.sleep(1)
            if len(scribe)>0: # 加入对scribe长度的判断,部分书是没有scribe的信息的。
                print("正在下载...")
                print("{},{},{},{},{}".format(title,score,herf,scribe[0],num,))
                f.write("{},{},{},{},{}".format(title,score,herf,scribe[0],num,))# 将下载好的数据,写入CSV中
            else:
                print("正在下载...")
                print("{},{},{},{}".format(title,score,herf,num))
                f.write("{},{},{},{}".format(title,score,herf,num))

我们来看下打印的结果:

C:\Python\python.exe C:/Users/Administrator/Desktop/Python项目实战/02、爬取豆瓣TOP250.py
正在下载...
红楼梦,9.6,https://book.douban.com/subject/1007305/,都云作者痴,谁解其中味?,257088人评价
                
正在下载...
活着,9.4,https://book.douban.com/subject/4913064/,生的苦难与伟大,416666人评价
                
正在下载...
百年孤独,9.2,https://book.douban.com/subject/6082808/,魔幻现实主义文学代表作,264291人评价
                
正在下载...
1984,9.3,https://book.douban.com/subject/4820710/,栗树荫下,我出卖你,你出卖我,127031人评价
                
正在下载...
飘,9.3,https://book.douban.com/subject/1068920/,革命时期的爱情,随风而逝,142645人评价
                
正在下载...
三体全集,9.4,https://book.douban.com/subject/6518605/,地球往事三部曲,24195人评价
                
正在下载...
三国演义(全二册),9.2,https://book.douban.com/subject/1019568/,是非成败转头空,109337人评价
                
正在下载...
白夜行,9.2,https://book.douban.com/subject/10554308/,一宗离奇命案牵出跨度近20年步步惊心的故事,211661人评价

结果太多,我们就不在这里过多展示了。

不过,这里有一个技巧,就是我们在进行网页解析的时候,其实可以直接copy到网页的xpath的,具体如下图所示。


网页解析.png

还有一点需要注意的是,有的时候,下载下来的数据,显示的比较凌乱,部分表格当中的格式有些空格或者其他非常讨厌的元素,这个时候,我们可以使用Excel表中的=trim()函数来进行处理。

好了,以上就是今天作者分享的内容。

2020年3月1日
北京市通州区京贸中心

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容