爬虫项目: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('<p class="">','').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 class="rating_num" property="v:average">(.*?)<\/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 class="inq">(.*?)<\/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()
    运行结果如下:


    其实一开始,有想过是不是直接用正则表达式找就行了,不用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
比较容易被卡住的点就是电影名称里有许多的别名,如图:                                                                                             

可以看出,每一个电影的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('<p class="">','').replace('\n                            ','').replace('\xa0','').replace('\n                        ',''))
    return targets_workers

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_38654336/article/details/79518379
今日推荐