爬取豆瓣影评TOP250Demo

在爬取了糗事百科的段子之后,我发现还挺好玩的。接着想还有什么是好玩的呢?因为平时也喜欢看电影,就进入豆瓣电影的官网,看到豆瓣电影TOP250的页面。哎,把这个榜单爬下来应该挺好玩的吧。话不多说,马上行动。

这里用的还是最基础的urllib库和re库,通过正则表达式匹配需要的内容,当然,之后还会有更加高级的方法,但是多写简单的可以提高对原理的认识。简单总结一下python爬虫爬取简单静态网页的一般步骤:

1.打开待爬取的网页右键查看源代码,通常我们想要获取的信息都在指定的标签下,通过观察,找出规律。

2.用正则表达式表达这种规律。

3.添加代码根据正则表达式爬取相应内容,并输出在控制台/保存到文件/保存到数据库。

由于该Demo在整体上和上个爬取糗事百科的Demo类似,因此有的代码细节不赘述。

首先,看一下豆瓣电影TOP250的网页第一页源代码:


该Demo仅仅获取电影的名称和排名,可以看到<em class="">1</em>中的1就是排名,而<span class="title">肖申克的救赎</span>就是名称。因此设计正则表达式的模式为pattern = '<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>'(如果发现输出结果和预期的不同,大概率是模式设计的不好,最好检查一下。)

TOP250有10页,每页放了25部电影,而观察每一页的url,会发现一个规律:

第一页的URL:


第三页的URL:


发现除了start=x外,其余都相同,而且第一页x=0,第三页x=50,........,第10页x=225。因此构造待爬取的URL为:

url = 'https://movie.douban.com/top250'
for i in range(0, 250, 25):
 	des_url = url + '?start=' + str(i) + '&filter='
拿到了URL,就可以进行分析和爬取了,直接上代码:

# 获取URL内容的函数
def getURLText(url):
    try:
        request = urllib.request.Request(url, headers = headers)
        response = urllib.request.urlopen(request)
        content = response.read().decode('utf-8')
        return content
    except Exception as e:
        print(e)

getURLText(url)函数根据传入的url获取网页信息并返回

# 对得到的内容进行解析,写入
def doContent(path, content):
    pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>', re.S)
    items = re.findall(pattern, content)
    for item in items:
        f = open(path, 'a')
        # 格式化写入字符,%-10s表示在字符串后面添加占位符,文本左对齐
        f.write('%-10s%-10s' % (item[0], item[1]))
        f.write('\n')
        f.close()

这里获取网页信息并保存在文件中。以下是完整代码:
import re
import urllib.request

user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {'User-Agent': user_agent}

# 获取URL内容的函数
def getURLText(url):
    try:
        request = urllib.request.Request(url, headers = headers)
        response = urllib.request.urlopen(request)
        content = response.read().decode('utf-8')
        return content
    except Exception as e:
        print(e)

# 对得到的内容进行解析,写入
def doContent(path, content):
    pattern = re.compile('<li>.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?</li>', re.S)
    items = re.findall(pattern, content)
    for item in items:
        f = open(path, 'a')
        # 格式化写入字符,%-10s表示在字符串后面添加占位符,文本左对齐
        f.write('%-10s%-10s' % (item[0], item[1]))
        f.write('\n')
        f.close()

# 主函数
def main():
    url = 'https://movie.douban.com/top250'
    path = 'C:/Users/Administrator/Desktop/doubanMovieTop250.txt'

    for i in range(0, 250, 25):
        des_url = url + '?start=' + str(i) + '&filter='
        content = getURLText(des_url)
        items = doContent(path, content)

main()
执行结果:


漂亮~看到自己写的代码跑出想要的结果才是最开心的啦,之后可以发挥想象力,爬出更有趣的内容。

加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值