爬取豆瓣影评TOP250Demo

来源:互联网 发布:linux 关机脚本 编辑:程序博客网 时间:2024/04/29 11:11

在爬取了糗事百科的段子之后,我发现还挺好玩的。接着想还有什么是好玩的呢?因为平时也喜欢看电影,就进入豆瓣电影的官网,看到豆瓣电影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 reimport urllib.requestuser_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()
执行结果:


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

加油!