昨天,我们了解了如何爬取豆瓣某一个电影固定的位置信息,包含电影名称、导演、演员及评分等,今天我们来了解一下如何爬取豆瓣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的,具体如下图所示。
还有一点需要注意的是,有的时候,下载下来的数据,显示的比较凌乱,部分表格当中的格式有些空格或者其他非常讨厌的元素,这个时候,我们可以使用Excel表中的=trim()函数来进行处理。
好了,以上就是今天作者分享的内容。
2020年3月1日
北京市通州区京贸中心