几个简单的小示例
豆瓣电影 TOP 250
获取豆瓣电影 TOP 250 的电影信息并保存到 MongoDB 中,这里使用的数据库名为 movies,集合名为 douban。可以使用自己定义的数据库和集合,以下几个示例相同。
import re
import pymongo
import requests
from lxml import etree
def get_page(url):
"""
Used to get page source code
@params:
url - the target url
@returns:
html - a etree.HTML instance
"""
resp = requests.get(url)
html = etree.HTML(resp.text)
return html
def get_movies(html):
"""
Used to crawl movies from a page
@params:
html - a etree.HTML instance
"""
# 使用 xpath 获取当前页所有电影条目信息
items = html.xpath('//ol[@class="grid_view"]/li')
for item in items:
# 遍历当前页所有电影条目,继续通过 xpath 获取详细信息
movie = {
}
movie['title'] = del_space(item.xpath('.//span[@class="title"]/text()'))
movie['info'] = del_space(item.xpath('.//div[@class="bd"]/p[1]/text()'))
movie['rating'] = item.xpath('.//span[@class="rating_num"]/text()')[0]
movie['review_num'] = item.xpath('.//div[@class="bd"]/div/span[4]/text()')[0]
quote = del_space(item.xpath('.//div[@class="bd"]/p[2]//text()'))
# 因为有的电影不存在 quote,所以需要判断获取的 quote 是不是空列表
movie['quote'] = quote[1] if len(quote) > 1 else ""
# 打印电影信息
print(movie)
# 保存到数据库中
save_movie(movie)
def del_space(items):
"""
Used to delete extra space from a list and then return it
@params:
items - a list instance
"""
# 使用正则表达式删除空白符并返回
return [re.sub(r'\s', '', item) for item in items]
def save_movie(movie):
"""
Used to save a movie
@params:
movie - a dict instance
"""
client = pymongo.MongoClient('localhost')
collection = client['movies']['douban']
collection.insert_one(movie)
def main():
# 每一页 url 的变化很明显,只有 start 参数在改变,所以直接通过循环抓取所有电影信息
base_url = 'https://movie.douban.com/top250'
# 抓取所有页面的电影
for i in range(10):
page = get