爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP

爬虫1:Requests+Xpath 爬取豆瓣电影TOP

【抓取】:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html

【分页】:参考前文 爬虫系列2:https://www.cnblogs.com/yizhiamumu/p/10267721.html

【保存】:参考前文 爬虫系列3:https://www.cnblogs.com/yizhiamumu/p/10270926.html

【动态】:参考前文 爬虫系列4:https://www.cnblogs.com/yizhiamumu/p/10272977.html

 

1 电影名称

# 1 Requests+Xpath 菜鸟爬取豆瓣TOP 
# 电影名称

'''
Requests+Xpath 爬取豆瓣电影

安装 Python 应用包
pip install requests
pip install lxml

获取元素的Xpath信息并获得文本:

手动获取:定位目标元素,在网站上依次点击:右键 > 检查
file=s.xpath('元素的Xpath信息/text()') 

快捷键“shift+ctrl+c”,移动鼠标到对应的元素时即可看到对应网页代码:

在电影标题对应的代码上依次点击 右键 > Copy > Copy XPath,获取电影名称的Xpath:


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


film=s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/@title')
print(film)


# 打印:['追风筝的人']

 

2 全部书名

# 2 全部书名

'''
浏览器经常会自己在里面增加多余的 tbody 标签,我们需要手动把这些标签删掉。


分别复制《追风筝的人》、《小王子》、《围城》、《解忧杂货店》的 xpath 信息进行对比:

//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[2]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[3]/tbody/tr/td[2]/div[1]/a
//*[@id="content"]/div/div[1]/div/table[4]/tbody/tr/td[2]/div[1]/a

比较可以发现书名的 xpath 信息仅仅 table 后的序号不一样,并且跟书的序号一致,于是去掉序号(去掉 tbody),我们可以得到通用的 xpath 信息:

//*[@id=“content”]/div/div[1]/div/table/tr/td[2]/div[1]/a


'''

import requests 
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).text
s=etree.HTML(data)


file=s.xpath('//*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/@title')

for title in file:
    print(title)



# 打印:
追风筝的人
解忧杂货店
小王子
白夜行
围城
挪威的森林
三体
嫌疑人X的献身
活着
红楼梦
百年孤独
不能承受的生命之轻
看见
达·芬奇密码
平凡的世界(全三部)
三体Ⅱ
三体Ⅲ
简爱(英文全本)
哈利·波特与魔法石
天才在左 疯子在右
送你一颗子弹
傲慢与偏见
我们仨
飘
倾城之恋

 

3 爬取页面多个信息时的数据准确匹配问题

# 3 爬取页面多个信息时的数据准确匹配问题

# strip(“(”) 表示删除括号, strip() 表示删除空白符。

'''

问题:我们默认书名和评分是正确的信息,如果某一项少爬或多爬了信息,匹配错误


思路:书名的标签肯定在这本书的框架内,以每本书为单位,分别取获取对应的信息,完全匹配

//*[@id=“content”]/div/div[1]/div/table[1]   #整本书
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a   #书名
//*[@id=“content”]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]   #评分

我们发现,书名和评分 xpath 的前半部分和整本书的 xpath 一致的, 那我们可以通过这样写 xpath 的方式来定位信息:

file=s.xpath(“//*[@id=“content”]/div/div[1]/div/table[1]”)
title =div.xpath(“./tr/td[2]/div[1]/a/@title”)
score=div.xpath(“./tr/td[2]/div[2]/span[2]/text()”)

'''


import requests 
import time
from lxml import etree


url = 'https://book.douban.com/top250'
data = requests.get(url).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]
    href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
    score = div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
    num = div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")")
    scribe = div.xpath("./tr/td[2]/p[2]/span/text()")
    
    time.sleep(2)
    
    print("{}{}{}{}{}".format(title,href,score,num,scribe[0]))


# 打印:

追风筝的人https://book.douban.com/subject/1770782/8.9327174人评价
                为你,千千万万遍
解忧杂货店https://book.douban.com/subject/25862578/8.6298863人评价
                一碗精心熬制的东野牌鸡汤,拒绝很难
小王子https://book.douban.com/subject/1084336/9.0252153人评价
                献给长成了大人的孩子们

 

4 翻页

# 4翻页
'''
https://book.douban.com/top250?start=0 #第一页
https://book.douban.com/top250?start=25 #第二页
https://book.douban.com/top250?start=50 #第三页

以每页25为单位,递增25,只是 start=()的数字不一样

写一个循环

for a in range(3):    
  url = 'https://book.douban.com/top250?start={}'.format(a*25)
  #3个页面,用 a*25 保证以25为单位递增
  
'''

import requests 
import time 
from lxml import etree


for a in range(3):
    url = 'https://book.douban.com/top250?start={}'.format(a*25)
    data = requests.get(url).text

    s=etree.HTML(data)
    file=s.xpath('//*[@id="content"]/div/div[1]/div/table')
    time.sleep(3)

    for div in file:
        title = div.xpath("./tr/td[2]/div[1]/a/@title")[0]
        href = div.xpath("./tr/td[2]/div[1]/a/@href")[0]
        score=div.xpath("./tr/td[2]/div[2]/span[2]/text()")[0]
        num=div.xpath("./tr/td[2]/div[2]/span[3]/text()")[0].strip("(").strip().strip(")").strip()
        scrible=div.xpath("./tr/td[2]/p[2]/span/text()")

        if len(scrible) > 0:
            print("{},{},{},{},{}\n".format(title,href,score,num,scrible[0]))
        else:
            print("{},{},{},{}\n".format(title,href,score,num))






# 打印:

追风筝的人,https://book.douban.com/subject/1770782/,8.9,327193人评价,为你,千千万万遍

解忧杂货店,https://book.douban.com/subject/25862578/,8.6,298891人评价,一碗精心熬制的东野牌鸡汤,拒绝很难

小王子,https://book.douban.com/subject/1084336/,9.0,252173人评价,献给长成了大人的孩子们

 

本文地址github:https://github.com/yizhiamumu/pythonSample


readme.txt

公众号:一只阿木木

博客园:http://www.cnblogs.com/yizhiamumu/

github:https://github.com/yizhiamumu/

posted on 2018-08-09 19:00  一只阿木木  阅读(1884)  评论(0编辑  收藏  举报