python爬虫实战从零开始_Python 从零开始爬虫(三)——实战:requests+BeautifulSoup实现静态爬取...

前篇全片都是生硬的理论使用,今天就放个静态爬取的实例让大家体验一下BeautifulSoup的使用,了解一些背后的原理。

顺便在这引入静态网页的概念——静态网页是指一次性加载所有内容的网页,爬虫一次请求便能得到所有信息,对爬虫非常友好,适合练手

豆瓣top250电影信息爬取

这是一个老掉牙的经典实例了,但越是经典,越有示范性作用,最重要的一点是,它是静态的。

给出网站:https://movie.douban.com/top250

打开F12/右键检查第一个电影,分析源码先,发现每个

标签就对应着一个电影的信息。

bV83Wd?w=1549&h=498

我们来爬取每部电影的图片,名称,导演演员,类型,评分,和它的一句话总结,继续对

标签进行分析,又发现信息又在
标签里,而这标签只存在于标签中,其它地方不存在,这样可以用find_all()方法把他们全部分离出来。这里不选择
标签是它没有唯一性,电影以外的内容也有标签。

bV84fA?w=937&h=509

布置好伪装后就可一开始根据每个

标签进行信息筛选了:

图片链接是

的上上个兄弟标签
的孙子的src属性的值

电影名有多个,都在

标签里,用get_text()把它们串起来

导演演员是

标签的第一段字符串

类型是

标签的第二段字符串

评分和评分人数都在

标签里,又用get_text()串起来

一句话总结直属于标签

html中的&NBSP(实际上是小写,这里大写避免markdown识别)对应字符串中的\xa0,可用replace方法替换掉

url = 'https://movie.douban.com/top250'

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}

r=requests.get(url,headers=headers)

soup = BeautifulSoup(r.text,'lxml')

for each in soup.find_all('div',class_='info'):

img_url = each.previous_sibling.previous_sibling.a.img['src']#图片链接

'''with open('*.jpg','wb') as img:#还可以顺便下载回来,名字自起

img.write(requests.get(img_url,headers=headers).content)'''

title=each.find('div',class_='hd').get_text(strip=True).replace('\xa0','')#标题

actor = list(each.find('p',class_='').strings)[0].strip().replace('\xa0','')#导演演员

type_ = list(each.find('p',class_='').strings)[1].strip().replace('\xa0','')#类型

score = each.find('div',class_='star').get_text('/',strip=True)#评分及人数

quote = each.find('span',class_='inq').string#一句话总结

print([img_url,title,actor,type_,score,quote])#这里只简单打出来看下,怎样存储由你来决定

但是这样只有25部电影啊,是的,'https://movie.douban.com/top250'指向第一页,我们现在只爬了一页,其实还有9页还没爬啊,这是就要构造网址了。

我们点到第二页,发现网址变成了https://movie.douban.com/top2...,第三页start条件值变成50,我们可以得出结论,每下一页,start条件值就加25。第一页start=0,第二页start=25.....第十页start=225。这样就可以循环构造网页并爬取了,这交给读者实现

下面笔者提供另一种思路:网页不是有下一页的按钮吗,右键检查一下,发现它已经包含了要构造的部分了,是一个属性值,提取出来接到原网址上即得到下一页的网址,这样能完全爬取所有页数,不用像上面一样设置循环次数。

bV838q?w=886&h=87

贴上完整代码

import requests

from bs4 import BeautifulSoup

url = 'https://movie.douban.com/top250'

with open('douban.txt','w',encoding='utf-8') as f:

while url :

headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}

r=requests.get(url,headers=headers)

soup = BeautifulSoup(r.text,'lxml')

for each in soup.find_all('div',class_='info'):

img_url = each.previous_sibling.previous_sibling.a.img['src']

title=each.find('div',class_='hd').get_text(strip=True).replace('\xa0','')

actor = list(each.find('p',class_='').strings)[0].strip().replace('\xa0','')

#将生成器list化后索引,strip()去除两边空格再用空字符替换&nbsp

type_ = list(each.find('p',class_='').strings)[1].strip().replace('\xa0','')

score = each.find('div',class_='star').get_text('/',strip=True)

if each.find('span',class_='inq'):#注意有部电影没有总结,也就没有标签这里用if检测一下防止None使用string方法报错

quote = each.find('span', class_='inq').string

else:

quote = '没有总结哦'

print([img_url,title,actor,type_,score,quote])

try:#到最后一页时没有下一页按钮,会报TypeError,这时用try语句让url=None使while循环停止

url = 'https://movie.douban.com/top250' + soup.find('span',class_='next').a['href']

except TypeError:

url = None

本实例的筛选方法已经讲的很细致了,几乎提及了BeautifulSoup的所有方法,希望大家能通过此实例能加深对BeautifulSoup的理解,然后自己手打一些爬虫出来,小的十几行多的几十行都可以,爬贴吧什么的都可以。

还是那句话“只看不实践的程序员不是好程序员”

下一篇应该会将正则表达式,更加强大也更加难的信息匹配方法

下下篇了解一下动态爬取?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值