爬虫项目:requests爬取豆瓣电影TOP250存入excel中

    这次爬取是爬取250部电影的相关内容,分别用了requests请求url,正则表达式re与BeautifulSoup作为内容过滤

openpyxl作为excel的操作模块,本人为才学不久的新手,代码编写有点无脑和啰嗦,希望有大神能多提建议

    首先,代码清单如下:

import requests
import re
from bs4 import BeautifulSoup
import openpyxl
def get_movie_top250_name(soup):
    targets = soup.find_all('span',class_="title")           #用BeautifulSoup找寻一个内容为一个列表
    targets_name = re.findall(r'.*?title">(.*?)<\/span',str(targets))       #用正则表达式去掉标签
    for each in targets_name:               #剔除targets_name当中的别名
        if '\xa0' in each:
            targets_name.remove(each)
    return targets_name

def get_movie_top250_workers(soup):
    targets = soup.find_all('p',class_="")
    targets_workers = []
    for each in targets:
        targets_workers.append(each.text.replace('

','').replace('\n ','').replace('\xa0','').replace('\n ','')) return targets_workers def get_movie_top250_star(soup): targets = soup.find_all('div', class_="star") targets_star = re.findall(r'(.*?)<\/span>',str(targets)) return targets_star def get_movie_top250_quote(soup): targets = soup.find_all('p', class_="quote") targets_quote = re.findall(r'(.*?)<\/span>',str(targets)) return targets_quote def save_to_excel(name,workers,star,quote): wb = openpyxl.Workbook() ws =wb.active ws['A1'] = "电影名称" ws['B1'] = "工作人员" ws['C1'] = "评分" ws['D1'] = "描述" for i in range(len(name)): result = [name[i],workers[i],star[i],quote[i]] ws.append(result) wb.save("豆瓣电影TOP250.xlsx") def main(): numbers = 1 name = [] workers = [] star = [] quote = [] result = [] while numbers: url = 'https://movie.douban.com/top250?start={}&filter='.format(numbers-1) headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} res = requests.get(url,headers = headers) soup = BeautifulSoup(res.text, "html.parser") name_1 = get_movie_top250_name(soup) workers_1 = get_movie_top250_workers(soup) star_1 = get_movie_top250_star(soup) quote_1 = get_movie_top250_quote(soup) for i in range(len(name_1)): name.append(name_1[i]) workers.append(workers_1[i]) star.append(star_1[i]) quote.append(quote_1[i]) numbers += 25 if numbers > 250: break save_to_excel(name,workers,star,quote) if __name__ == '__main__': main()

    运行结果如下:

爬虫项目:requests爬取豆瓣电影TOP250存入excel中_第1张图片

    其实一开始,有想过是不是直接用正则表达式找就行了,不用BeautifulSoup。然后完全是因为自己想多熟悉一下两个的用法,所以都用到了,自认为两个一起用能更准确些。首先谈一谈最重要的是码代码时候遇到的一些问题:

1.抓取电影的名字:

def get_movie_top250_name(soup):
    targets = soup.find_all('span',class_="title")           #用BeautifulSoup找寻一个内容为一个列表
    targets_name = re.findall(r'.*?title">(.*?)<\/span',str(targets))       #用正则表达式去掉标签
    for each in targets_name:               #剔除targets_name当中的别名
        if '\xa0' in each:
            targets_name.remove(each)
    return targets_name
比较容易被卡住的点就是电影名称里有许多的别名,如图:                                                                                              爬虫项目:requests爬取豆瓣电影TOP250存入excel中_第2张图片

可以看出,每一个电影的class ='title'有两个,这就不好分辨了。由于本人刚学不久,所以在筛选电影的名字的时候,就花了我半天时间。其实回想很简单,如果把所有的名字print出来,就会发现别名前面都会有字符'\xa0',所以只要做一个if判断的过滤就可以解决(当时if判断也想了半天,结果问人才写出来的,基础不好,要补基础)。

2.爬取工作人员的内容,其中也包括电影的性质归属了,两个一起抓了,其实我就是懒,没有分开:

def get_movie_top250_workers(soup):
    targets = soup.find_all('p',class_="")
    targets_workers = []
    for each in targets:
        targets_workers.append(each.text.replace('

','').replace('\n ','').replace('\xa0','').replace('\n ','')) return targets_workers

这里的抓取只用到了BeautifulSoup,然后做一个replace的过滤,将多余的部分全部过滤(节点、空格之类的),比较简单

3.抓取评分、描述(一句很骚的话描述了整个电影),都跟第二点差不多,略过

下一步计划开始学习Scrapy框架抓取。。

你可能感兴趣的:(项目)