最近在学习python爬虫系列课程,也在学习写一些程序实例,这篇文章是爬取豆瓣图书的前250本数的名称和其他信息。
前期准备
1.安装适合的python编辑器,本人使用的是Anaconda中的Jupyter Notebook,因为便于编写和管理python的各种第三方库,所以推荐大家也使用。下载地址为:https://www.anaconda.com/download/
2.本文章要使用python库中的requests和BeautifulSoup4库爬取网页和解析网页。因为不是python自带的标准库,所以要手动安装以上两个库。
- requests库下载地址:https://pypi.python.org/pypi/requests/
- Beautiful Soup4库下载地址:https://pypi.python.org/pypi/beautifulsoup
3.用pip安装以上两个库,Win+R打开输入cmd, 输入如下:
pip install requests
pip install beautifulsoup4
网页分析
下面我们开始我们的爬虫程序主体,我们将要访问的是豆瓣图书的前250榜单的书名和其他信息
https://book.douban.com/top250?
如下图:
下面我们检索我们所需要的字段所在的标签,右键打开源代码检查元素,我们以查询“追风筝的人”书名为例查找所在的标签;如下图:
我们可以看到所有的字段都存储在标签div{'class':'indent'}中,每个字段都在各个table标签中,书名称在div{'class':'p12'}的a 标签中,其他信息在p标签中{’class':'pl'}中。如下图:
下面我们还要看到250本书在10个页面中,要全部爬取下来我们还需要观察更多的网页结构:
第一个网页的链接为:https://book.douban.com/top250?
第二个网页的链接为:https://book.douban.com/top250?start=25
第三个网页的链接为:https://book.douban.com/top250?start=50
我们可以发现第二、三页链接上有个start=?,可以判断为每页的起始值为0,25,50...
上面的每页都有类似的结构,我们可以开始编写我们的主程序。
程序结构
先导入我们所需要的requests库Beautiful Soup库;
import requests
from bs4 import BeautifulSoup
然后来编写我们程序的主体框架;
def getHTMLText(url): #获得所需要的网页页面信息
return
def get_data(list,html): #从网页中获取页面信息,并存入列表中
return
def print_data(list): #将存储在列表中的信息输出打印出来
def main():
main()
接下来我们根据各个函数的目的,填充函数内的内容,第一个函数是要获取页面的信息;
def getHTMLText(url):
try:
r = requests.get(url ,timeout = 30)
r.raise_for_status()
r.encoding =r.apparent_encoding
return r.text
except:
return "产生异常"
第二个函数是要获取数据,并存储在列表中;
def get_data(list,html):
tables = BeautifulSoup(html, 'html.parser').find('div', {'class':'indent'}).find_all('table')
#在div标签中找到所有的table标签
for table in tables: #在所有的table标签中遍历元素
title = table.find('div', {'class':'pl2'}).find('a').get_text() #找到书名所在的a标签
info = table.find('p', {'class':'pl'}).get_text() #找到其他信息所在的p标签
list.append([title.strip(),info.strip()]) #将其存储列表,用strip()出去其中的空字符串
第三个函数是将列表中的数据输出打印出来;
def print_data(list):
print("{:^6}\t{:^10}\t{:^16}".format('序号','书名','信息'))
count = 0 #用count来表示爬取的序号
for b in list:
count += 1
print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))
最后我们来编写主函数;
def main():
start_url = 'https://book.douban.com/top250?' #这是起始也的url
depth = 10 #我们爬取的深度为10页
info_list = []
for i in range(depth): #在每页中进行遍历
url = start_url + str(25*i) #实际的url是原始url加上start=?
html = getHTMLText(url) #解析每页的网页信息
get_data(info_list,html) #获取数据
print_data(info_list) #打印输出最后的列表
main()
上面我们就全部编写完成这个爬虫程序,输出如下;
上面我们爬取的250本的豆瓣图书信息,但是不知道为什么我们使用的strip()除去空字符,在三体这本书还是有空字符存在。希望大家指点方法解决。
程序代码
上面我们成功的写完了豆瓣爬虫的代码,并成功输出了我们大致所要的结果,全部代码如下;
import requests
from bs4 import BeautifulSoup
def getHTMLText(url):
try:
r = requests.get(url ,timeout = 30)
r.raise_for_status()
r.encoding =r.apparent_encoding
return r.text
except:
return "产生异常"
def get_data(list,html):
tables = BeautifulSoup(html, 'html.parser').find('div', {'class':'indent'}).find_all('table')
for table in tables:
title = table.find('div', {'class':'pl2'}).find('a').get_text()
info = table.find('p', {'class':'pl'}).get_text()
list.append([title.strip(),info.strip()])
def print_data(list):
print("{:^6}\t{:^10}\t{:^16}".format('序号','书名','信息'))
count = 0
for b in list:
count += 1
print("{:^6}\t{:^16}\t{:^16}".format(count,b[0],b[1]))
def main():
start_url = 'https://book.douban.com/top250?'
depth = 10
info_list = []
for i in range(depth):
url = start_url + str(25*i)
html = getHTMLText(url)
get_data(info_list,html)
print_data(info_list)
main()
总结
1.爬虫主要用requests库和Beautiful Soup库可以简明地爬取网页上的信息;
2.先定好程序主要框架,再根据目的需求填充函数内容:获取网页信息>爬取网页数据>打印输出;
3.对于所有的信息存储于多页,要观察网页信息,构造每页的url链接来解决;
3.最重要的是解析网页结构,最好可以用标签树的形式确定字段所在的标签,并遍历全部标签存储数据。

1518

被折叠的 条评论
为什么被折叠?



