豆瓣电影top250,selenium自动化提取信息

今天要爬取豆瓣电影榜单的top250电影的一些信息,利用selenium自动化的跳转和点击,并结合requests方法,用BeautifulSoup大法,最终成功提取了top250的电影名,所有主演,年份,评分,电影简介,想看的人数,并将数据存进了MongoDB里面。
接下来,介绍一下步骤。
首先,通过自动化软件selenium,进入豆瓣首页,并模拟点击操作,进入top250页面

#这里需要导入的模块
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
#进入豆瓣首页
def get_to_douban(browser):
    douban_page=browser.get('https://www.douban.com/')
#进入top250页面
def get_to_top250(browser):
    get_to_douban(browser)
    film_botton=browser.find_element_by_css_selector('#anony-nav > div.anony-nav-links > ul > li:nth-child(2) > a')
    film_botton.click()
    try:
        rate_botton=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#db-nav-movie > div.nav-secondary > div > ul > li:nth-child(4) > a')))
        rate_botton.click()
    except TimeoutException as e:
        print(e)
        rate_botton=browser.find_element_by_link_text(u'排行榜')
        rate_botton.click()
    try:
        top_botton=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#douban-top250 > div.douban-top250-hd > h2 > span > a')))
        top_botton.click()
    except TimeoutException as e:
        print(e)
        top_botton=browser.find_element_by_partial_link_text(u'全部')
        top_botton.click()
    return browser.page_source #返回页面资源

进入了top250页面,那么接下来就是要提取每部电影的链接

#下面我用了BeautifulSoup和re两种方法解析了这个页面,并且都成功得到了每部电影的链接
def parser_index_page(html):
    # urls_list=[]
    # Soup=BeautifulSoup(html,'lxml')
    # ol=Soup.find('ol',class_="grid_view")
    # li=ol.find_all('li')
    # for i in li:
    #     url=i.find('a').get('href')
    #     urls_list.append(url)
    #上面使用BeautifulSoup方法解析页面,接下来用正则表达式解析页面
    pattern=re.compile('<ol class="grid_view".*?/ol>',re.S)
    ol=pattern.search(html).group() # 只用加了group才能是一个text文本,否则只是一个对象
    url_pattern=re.compile('https://movie.douban.com/subject/\d+?/',re.S)
    urls1=url_pattern.findall(ol)
    urls=set(urls1) # 用set去重
    urls_list=list(urls) #强制转换回list
    return urls_list
    #下面使用的是re正则表达式进行的匹配

获得电影链接后,我就想着用requests模块,对链接进行请求,然后用BeautifulSoup解析出我想要在每部电影中要提取的信息
所以接下来,我建立了一个parser_one_movie函数,用于对每部电影进行提取,函数的参数是url,每部电影的链接,即上一部中提取的链接

def parser_one_movie(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}

    html = requests.get(url, headers=headers, verify=False)
    Soup = BeautifulSoup(html.text, 'lxml')
    title = Soup.find('h1').find('span', property="v:itemreviewed").get_text()
    year = Soup.find('h1').find('span', class_="year").get_text()
    atrrs = Soup.find('span', class_='actor').find('span', class_="attrs").find_all('a', rel="v:starring")
    names = []
    for i in atrrs:
        name = i.get_text()
        names.append(name)
    score = Soup.find('div', id="interest_sectl").find('div', class_="rating_self clearfix").get_text().strip()
    short = Soup.find('span', property="v:summary").get_text().strip()
    number = Soup.find('div', class_="rating_sum").find('a', class_="rating_people").get_text()
    a = {'title': title, 'year': year, 'names': names, 'score': score, 'short': short, 'number': number}
    db.insert_one(a) # 直接在这里将每条数据都插进了MongoDB中

这样的话,我就将一个页面的所有电影的信息提取并存储到了MongoDB中了
接下来在用selenium模拟点击,点击‘下页’,完成页面的转换,代码如下:

def auto_jump_page(browser):
    next=wait.until(EC.presence_of_element_located((By.LINK_TEXT,u'后页>')))
    next.click()
    return browser.page_source

这样我们基本上就将整个过程中需要的函数建立完成了,接下来我们只需要进行一下整合操作,建立一个main函数

def main(browser,wait):
    get_to_douban(browser)
    html=get_to_top250(browser)
    urls_list=parser_index_page(html)
    for i in urls_list:
        try:#这里为了提高代码的健壮性,我建立一个try语句进行错误的捕捉,确实,有几部电影在解析页面时出现了None错误
            parser_one_movie(i)
        except Exception as e:
            print(e)
    for x in range(0,9):
        try:#这边也是,防止页面解析的失误造成程序的停止,不过这里没有错误发生
            htmls = auto_jump_page(browser)
            urls_lists = parser_index_page(htmls)
            for i in urls_lists:
                try:
                    parser_one_movie(i)
                except Exception as e:
                    print(e)
        except Exception:
            pass

以上基本上就是整个爬虫的代码,可以顺利完成爬取的过程
这就是我爬取的数据,总共有244条。
当然代码中有一个嵌套循环,可能比较慢,那可以在
` for x in range(0,9):
try:
htmls = auto_jump_page(browser)
urls_lists = parser_index_page(htmls)
for i in urls_lists:
try:
parser_one_movie(i)
except Exception as e:
print(e)
except Exception:
pass’
建立一个多线程加块爬取的速度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
好的,这是一个很常见的爬虫案例。下面是一个简单的 Python 代码示例,用于使用 Selenium 爬取豆瓣电影 Top250: ```python import time from selenium import webdriver # 创建 Chrome 浏览器驱动 driver = webdriver.Chrome() # 访问豆瓣电影 Top250 页面 driver.get('https://movie.douban.com/top250') # 循环爬取所有页面 while True: # 获取当前页面的所有电影信息 movies = driver.find_elements_by_xpath('//div[@class="info"]') # 循环打印每个电影的名称、导演和主演信息 for movie in movies: name = movie.find_element_by_xpath('.//a/span[@class="title"]').text director_and_actors = movie.find_element_by_xpath('.//div[@class="bd"]/p[1]').text print(name, director_and_actors) # 查找下一页的链接 next_link = driver.find_element_by_xpath('//span[@class="next"]/a') # 如果下一页链接不可点击,则说明已经到了最后一页,退出循环 if 'disabled' in next_link.get_attribute('class'): break # 点击下一页链接 next_link.click() # 等待一段时间,让页面加载完成 time.sleep(2) # 关闭浏览器驱动 driver.quit() ``` 这个代码片段使用 Chrome 浏览器驱动访问豆瓣电影 Top250 页面,并循环爬取每个页面上的电影信息。在每个页面上,它使用 XPath 查找电影名称、导演和主演信息,并打印到控制台中。然后,它查找下一页链接,并单击它以导航到下一页。如果下一页链接不可点击,则说明已经到了最后一页,退出循环。最后,它关闭浏览器驱动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值