Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影

前言

经过上篇博客Python爬虫小白教程(一)—— 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在就让我们爬取豆瓣评分TOP250的电影实战一下。

安装bs4库

除了Requests库之外,我们还需要BeautifulSoup库来解析爬取到的页面。在cmd中输入:

pip install bs4

或者在Anaconda Prompt中输入:

conda install bs4

网站分析

打开豆瓣电影TOP250 的网站,使用Chrome中的“检查”功能查看该网页的请求头,如下图所示。
在这里插入图片描述
按照教程一中的方法提取请求头:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
    'Host':'movie.douban.com'
}

发现第一页只有25个电影,点击下方第二页后URL变为https://movie.douban.com/top250?start=25&filter=
,点击第三页后URL变为https://movie.douban.com/top250?start=50&filter=,由此我们可以发现URL的规律。又发现将URL后面的&filter=删除后仍可以打开网页,故为了简便将URL改为https://movie.douban.com/top250?start=25

获取页面

为了模块化我们在此将获取页面的代码封装到一个函数中,如下。

import requests
from bs4 import BeautifulSoup

def get_page(url,params=None,headers=None):

    response = requests.get(url, headers=headers, params=params)
    print(response.url)
    page = BeautifulSoup(response.text, 'lxml')
    print("响应状态码:", response.status_code)
    
    return page

BeautifulSoup(response.text, 'lxml')中的lxml参数是一种常用的解析页面的方法。

爬取页面

运行下面的代码,即可得到第一页的网页代码。

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Host':'movie.douban.com'
    }
page = get_page('https://movie.douban.com/top250', headers=headers)
print(page)

输出如下
在这里插入图片描述
爬取成功后我们进行下一步的页面分析。

页面分析

Chrome中有一个很快捷的方法让我们找到想要获取的元素在网页代码中的位置。如下图所示,点击左上角的按钮,点击后用鼠标点击想要获取的元素。
在这里插入图片描述
在这里插入图片描述
然后系统将会为我们自动定位到该元素的代码。
在这里插入图片描述
分析此电影以及其他电影名字的位置,可见它们都在<div class="hb">中,然后我们用pagefind_all函数来找到代码中所有calss为hb的div,并将其保存到div_list中。

div_list = page.find_all('div',class_='hd')
print(div_list)

输出如下:
在这里插入图片描述
然后我们分析其中一个div。

print(div_list[0])

输出为:

<div class="hd">
<a class="" href="https://movie.douban.com/subject/1292052/">
<span class="title">肖申克的救赎</span>
<span class="title"> / The Shawshank Redemption</span>
<span class="other"> / 月黑高飞()  /  刺激1995()</span>
</a>
<span class="playable">[可播放]</span>
</div>

电影名字就在第一个span中,因此仅需要

div_list[0].a.span

便可以将第一个span中的内容输出来,输出为
<span class="title">肖申克的救赎</span>
使用.text获取里面的文字,再使用strip()去除空格,即

div_list[0].a.span.text.strip()

现在的输出是

'肖申克的救赎'

至此我们已经获得一个电影的名字,其余的使用循环即可,并将其保存到名为title_list的列表中,代码如下:

title_list = []

for div in div_list:
	title = div.a.span.text.strip()
	title_list.append(title)

至此我们已经获得第一个页面的所有电影名字。

其他页面

根据前面网站分析的步骤我们可以知道只要将传入Requests中get的参数params改变一下即可获得其他页面的网页,下面用一个循环获取其他的页面。

for i in range(11):
    params = {"start":(i*25)}
    page = get_page('https://movie.douban.com/top250',params=params,headers=headers)

综上,所有代码如下:

import time
import requests
from bs4 import BeautifulSoup

# 定义获取页面的函数
def get_page(url,params=None,headers=None):

    response = requests.get(url, headers=headers, params=params)
    page = BeautifulSoup(response.text, 'lxml')
    print(response.url)
    print("响应状态码:", response.status_code)
    
    return page


title_list = [] # 电影名列表
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
        'Host':'movie.douban.com'
    }
for i in range(11):
    params = {"start":(i*25)}
    page = get_page('https://movie.douban.com/top250',params=params,headers=headers)
    
    div_list = page.find_all('div',class_='hd')
    
    for div in div_list:
        title = div.a.span.text.strip()
        title_list.append(title)
    # 每次爬完后休眠1秒钟,防止爬取速度太快被封ip
    time.sleep(1)

title_list

输出如下:
在这里插入图片描述
使用

print(len(title_list))

可知title_list长度为250,可见我们已经成功获取到豆瓣评分TOP250 的所有电影名。

爬虫系列

Python爬虫小白教程(一)—— 静态网页抓取
Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
Python爬虫小白教程(三)——使用正则表达式分析网页
Python爬虫小白教程(四)—— 反反爬之IP代理池
Python爬虫小白教程(五)—— 多线程爬虫

  • 16
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
好的,我可以为您提供爬虫教程,以下是使用Scrapy框架爬取豆瓣电影TOP250的步骤: 1. 创建Scrapy项目 首先需要使用Scrapy命令行工具创建一个Scrapy项目,可以使用以下命令: ``` scrapy startproject douban_top250 ``` 该命令将会在当前目录下创建一个名为douban_top250的Scrapy项目。 2. 创建Spider 接下来需要创建一个Spider来定义爬取的规则,可以使用以下命令在Scrapy项目的spiders目录下创建一个名为douban_spider的Spider: ``` scrapy genspider douban_spider movie.douban.com ``` 在spiders目录下会生成一个名为douban_spider.py的文件,我们可以在该文件中定义爬取规则。 3. 编写Spider规则 在douban_spider.py文件中,我们需要定义如何爬取豆瓣电影TOP250的规则,以下是一个简单的例子: ```python import scrapy from scrapy import Selector from douban_top250.items import DoubanTop250Item class DoubanSpider(scrapy.Spider): name = "douban_spider" allowed_domains = ["movie.douban.com"] start_urls = [ "https://movie.douban.com/top250" ] def parse(self, response): selector = Selector(response) item_list = selector.xpath('//ol[@class="grid_view"]/li') for item in item_list: douban_item = DoubanTop250Item() douban_item['rank'] = item.xpath('div[@class="pic"]/em/text()').extract()[0] douban_item['title'] = item.xpath('div[@class="info"]/div[@class="hd"]/a/span[@class="title"]/text()').extract()[0] douban_item['rating'] = item.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()[0] douban_item['quote'] = item.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span[@class="inq"]/text()').extract()[0] yield douban_item ``` 在上述代码中,我们定义了一个名为DoubanSpider的Spider,并定义了一些爬取规则: - allowed_domains:定义允许爬取的域名; - start_urls:定义爬虫开始爬取的URL列表; - parse:定义如何解析响应结果,生成Item对象。 4. 定义Item 在上述代码中,我们定义了一个名为DoubanTop250Item的Item,需要在douban_top250/items.py文件中定义该Item,以下是一个简单的例子: ```python import scrapy class DoubanTop250Item(scrapy.Item): rank = scrapy.Field() title = scrapy.Field() rating = scrapy.Field() quote = scrapy.Field() ``` 在上述代码中,我们定义了DoubanTop250Item包含以下字段: - rank:电影排名; - title:电影名称; - rating:电影评分; - quote:电影的经典语录。 5. 运行Spider 在完成上述步骤后,就可以运行Spider开始爬取豆瓣电影TOP250了,可以通过以下命令来运行Spider: ``` scrapy crawl douban_spider -o douban_top250.csv ``` 该命令将会运行名为douban_spider的Spider,并将结果保存到douban_top250.csv文件中。 以上就是使用Scrapy爬取豆瓣电影TOP250的基本步骤,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值