Python爬虫快速入门,静态网页爬取( 四 )

接下来,我们需要利用CSS选择器将我们所需要的数据存储在items变量中,但是,如何找到图书名称所在的标签呢?
其实很简单,我们先打开https://book.douban.com/top250,右键单击红楼梦>检查,如下图所示:

Python爬虫快速入门,静态网页爬取

文章插图
 
不难看出,书名是a标签内属性title的值,且这个a标签位于class=“pl2”的div标签内 。
在知道了书名的“坐标”后,我们就可以使用CSS选择器啦:
items = soup.select('div.pl2 a')1此时items变量实际上是一个由Tag对象组成的列表,我们可以通过循环打印书名和对应的链接:
for item in items:name = item['title']link = item['href']print(name, link)1234完整的代码如下:
import requestsfrom bs4 import BeautifulSoupheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get('https://book.douban.com/top250', headers=headers)soup = BeautifulSoup(re.text, 'html.parser')items = soup.select('div.pl2 a')for item in items:name = item['title']link = item['href']print(name, link)1234567891011121314爬取到的结果:
红楼梦 https://book.douban.com/subject/1007305/活着 https://book.douban.com/subject/4913064/1984 https://book.douban.com/subject/4820710/百年孤独 https://book.douban.com/subject/6082808/飘 https://book.douban.com/subject/1068920/三体全集 https://book.douban.com/subject/6518605/三国演义(全二册) https://book.douban.com/subject/1019568/白夜行 https://book.douban.com/subject/10554308/房思琪的初恋乐园 https://book.douban.com/subject/27614904/福尔摩斯探案全集(上中下) https://book.douban.com/subject/1040211/动物农场 https://book.douban.com/subject/2035179/小王子 https://book.douban.com/subject/1084336/天龙八部 https://book.douban.com/subject/1255625/撒哈拉的故事 https://book.douban.com/subject/1060068/安徒生童话故事集 https://book.douban.com/subject/1046209/哈利•波特 https://book.douban.com/subject/24531956/人类简史 https://book.douban.com/subject/25985021/沉默的大多数 https://book.douban.com/subject/1054685/围城 https://book.douban.com/subject/1008145/平凡的世界(全三部) https://book.douban.com/subject/1200840/杀死一只知更鸟 https://book.douban.com/subject/6781808/局外人 https://book.douban.com/subject/4908885/明朝那些事儿(1-9) https://book.douban.com/subject/3674537/霍乱时期的爱情 https://book.douban.com/subject/10594787/笑傲江湖(全四册) https://book.douban.com/subject/1002299/12345678910111213141516171819202122232425仔细观察不难发现,上述所说的a标签内的文本内容只有书名,因此除了使用item[‘title’]外,我们还可以使用item.text:
for item in items:name = item.textlink = item['href']print(name, link)1234输出结果(结果太长这里仅展示前面的一部分):
红楼梦https://book.douban.com/subject/1007305/活着https://book.douban.com/subject/4913064/1984https://book.douban.com/subject/4820710/百年孤独https://book.douban.com/subject/6082808/1234567891011121314151617181920为什么使用item.text就会出现一些奇怪的换行呢?
我们知道,item.text是获取标签内的所有文本内容,空格,换行符等都会获取,我们再来看一下之前的a标签:
Python爬虫快速入门,静态网页爬取

文章插图
 
显然a标签里存在空格和换行符,因此如果想使用item.text输出结果,我们必须使用join()方法去掉这些多余的空格和换行符:
for item in items:name = ''.join(item.text.split())link = item['href']print(name, link)1234这样结果就可以正常显示啦 。
四、爬取所有Top250图书可能你已经发现了,我们之前爬取的图书仅仅是第一页的,并不是所有的Top250图书,那么如何爬取所有的呢?
我们进入第二页后,可以看到网址变成了https://book.douban.com/top250?start=25,相比原来多了个?start=25 。
我们再进入第一页,会发现网址变成了https://book.douban.com/top250?start=0 。之后,再进入最后一页,网址变成了https://book.douban.com/top250?start=225 。
我想你应该已经找到了其中的规律 。
很显然,"start="后面的数字总是以步长25进行递增,第一页此数字是0,第十页此数字是225,这让我们联想到了循环 。
我们先把之前爬取图书的代码封装成一个函数:
def spider(url):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get(url, headers=headers)soup = BeautifulSoup(re.text, 'html.parser')items = soup.select('div.pl2 a')for item in items:name = item['title']link = item['href']print(name, link)1234567891011


推荐阅读