您的位置:首页 > 运维架构

Datawhale爬虫(第5期)入门第二练||豆瓣电影TOP250的内容

2019-03-01 23:46 253 查看

python正则表达式:

正则表达式是一个特殊的字符串序列,可以方便的检测字符串是否与某种模式匹配!
1. re.match() 函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None

语法:

re.match(pattern, string, falgs=0)

示例:

import re
print(re.match('www', 'www.xiaomi.com').span())   # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com'))   # 不在起始位置匹配

2. re.search() 函数
re.search 扫描整个字符串,并返回第一个成功匹配的值

语法:

re.search(pattern, string, falgs=0)

示例:

import re
print(re.match('www', 'www.xiaomi.com').span())   # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com').span())   # 不在起始位置匹配

学习任务:结合requests、re两者的内容爬取豆瓣电影 Top 250里的内容:要求抓取名次、影片名称、国家、导演等字段。
思路分析:首先找到豆瓣top250的网址:
https://movie.douban.com/top250
通过手动翻页浏览,发现如下规律:
https://movie.douban.com/top250?start=0&filter=         # 第一页内容
https://movie.douban.com/top250                         # 第一页这个也可以
https://movie.douban.com/top250?start=25&filter=        # 第二页内容
https://movie.douban.com/top250?start=50&filter=        # 第三页内容
https://movie.douban.com/top250?start=75&filter=        # 第四页内容
因此我们只需要更改
start=
后面的数字即可构造出10页的网址 因为我们 只要 名次、影片名称、国家、导演等字段,因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先需要爬取进入详细页的网址链接,进而爬取数据

爬虫代码如下:
import requests
from lxml import etree
import re
import time

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/71.0.3578.98 Safari/537.36'    # 加入请求头
}

def get_movie_url(url):
"""
获取详细页URL的函数
:param url:
:return:
"""
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
movie_hrefs = selector.xpath('//div[@class="hd"]/a/@href')
for movie_href in movie_hrefs:
get_movie_info(movie_href)

def get_movie_info(url):
"""
获取详细页信息的函数
:param url:
:return:
"""
html = requests.get(url, headers=headers)
selector = etree.HTML(html.text)
try:
ranking = selector.xpath('//*[@id="content"]/div[1]/span[1]/text()')[0]  # 排名
name = selector.xpath('//*[@id="content"]/h1/span[1]/text()')[0]   # 电影名称
country = re.findall('<span class="pl">制片国家/地区:</span>(.*?)<br/>', html.text, re.S)[0]  # 国家
actor = selector.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]  # 导演
print(ranking + '    ' + name + '    ' + country + '    ' + '    ' + actor)
except IndexError:
pass

if __name__ == '__main__':
urls = ['https://movie.douban.com/top250?start=%s&filter=' % i for i in range(0, 250, 25)]
for url in urls:
get_movie_url(url)
time.sleep(3)
抓取到的数据在控制台打印出来的结果:
一共250条数据

第二天的学习任务就到这里了,记录每一天认真的自己,坚持输出,共勉!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: