豆瓣爬虫

文章目录

  • 分析网页结构
    • 目标内容
    • 网页跳转
  • 爪巴代码
  • 爪巴结果

分析网页结构

豆瓣爬虫_第1张图片

目标内容

豆瓣的网页源代码还是挺工整的:

<li>
    <div class="item">
         <div class="pic">
             <em class="">4em>
             <a href="https://movie.douban.com/subject/1295644/">
                 <img width="100" alt="这个杀手不太冷" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.webp" class="">
             a>
         div>
         <div class="info">
             <div class="hd">
                 <a href="https://movie.douban.com/subject/1295644/" class="">
                     <span class="title">这个杀手不太冷span>
                             <span class="title"> / Léonspan>
                         <span class="other"> / 杀手莱昂  /  终极追杀令(台)span>
                 a>


             div>
             <div class="bd">
                 <p class="">
                     导演: 吕克·贝松 Luc Besson   主演: 让·雷诺 Jean Reno / 娜塔莉·波特曼 ...<br>
                     1994 / 法国 / 剧情 动作 犯罪
                 p>

                 
                 <div class="star">
                         <span class="rating45-t">span>
                         <span class="rating_num" property="v:average">9.4span>
                         <span property="v:best" content="10.0">span>
                         <span>1743417人评价span>
                 div>

                     <p class="quote">
                         <span class="inq">怪蜀黍和小萝莉不得不说的故事。span>
                     p>
             div>
         div>
     div>
 li>

网页跳转

网页的跳转直接基于 URL :

https://movie.douban.com/top250?start=25&filter=

爪巴代码

from requests.exceptions import RequestException
from lxml import etree
from bs4 import BeautifulSoup
from pyquery import PyQuery as pq
import requests
import re,time,json

def getPage(url):
    '''爬取指定url页面信息'''
    try:
        #定义请求头信息
        headers = {
            'User-Agent':'User-Agent:Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'
        }
        # 执行爬取
        res = requests.get(url,headers=headers)
        #判断响应状态,并响应爬取内容
        if res.status_code == 200:
            return res.text
        else:
            return None
    except RequestException:
        return None

def parsePage(content):
    '''解析爬取网页中的内容,并返回字段结果'''
    #print(content)
    # =========使用pyquery解析==================
    # 解析HTML文档
    doc = pq(content)
    #获取网页中所有标签并遍历输出标签名
    items = doc("div.item")
    #遍历封装数据并返回
    for item in items.items():
        yield {
            'index':item.find("div.pic em").text(),
            'image':item.find("div.pic img").attr('src'),
            'title':item.find("div.hd span.title").text(),
            'actor':item.find("div.bd p:eq(0)").text(),
            'score':item.find("div.bd div.star span.rating_num").text(),
        }    

def parsePage(content):
    # =======使用Beautiful Soup解析====================
    # 解析HTML文档
    soup = BeautifulSoup(content,"lxml")
    #获取网页中所有标签并遍历输出标签名
    items = soup.find_all(name="div",attrs={"class":"item"})
    print(items)
    #遍历封装数据并返回
    for item in items:
        yield {
            'index':item.em.string,
            'image':item.find(name="img",attrs={'width':'100'}).attrs['src'],
            'title':item.find(name="span",attrs={'class':'title'}).string,
            'actor':item.select("div.bd p")[0].get_text(), #内有标签使用string获取不到
            'score':item.select("div.star span")[1].string,
        }

def parsePage(content):

    # =======使用xpath解析====================
    # 解析HTML文档,返回根节点对象
    html = etree.HTML(content)
    #获取网页中所有标签并遍历输出标签名
    items = html.xpath('//div[@class="item"]')
    #遍历封装数据并返回
    for item in items:
        yield {
            'index':item.xpath('.//div/em[@class=""]/text()')[0],
            'image':item.xpath('.//img[@width="100"]/@src')[0],
            'title':item.xpath('.//span[@class="title"]/text()')[0],
            'actor':item.xpath('.//p[@class=""]/text()')[0],
            'score':item.xpath('.//span[@class="rating_num"]/text()'),
            #'time':item[4].strip()[5:],
        }


def writeFile(content):
    '''执行文件追加写操作'''
    print(content)
    #with open("./result.txt",'a',encoding='utf-8') as f:
        #f.write(json.dumps(content,ensure_ascii=False) + "\n")
        #json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False

def main(offset):
    ''' 主程序函数,负责调度执行爬虫处理 '''
    url = 'https://movie.douban.com/top250?start=' + str(offset)
    #print(url)
    html = getPage(url)
    #判断是否爬取到数据,并调用解析函数
    if html:
        for item in parsePage(html):
            writeFile(item)

# 判断当前执行是否为主程序运行,并遍历调用主函数爬取数据
if __name__ == '__main__':
    #main(0)
    for i in range(10):
        main(offset=i*25)
        time.sleep(2)

爪巴结果

{'index': '1', 'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', 'title': '肖申克的救赎', 'actor': '\n                            导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins /...', 'score': ['9.7']}
{'index': '2', 'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg', 'title': '霸王别姬', 'actor': '\n                            导演: 陈凯歌 Kaige Chen\xa0\xa0\xa0主演: 张国荣 Leslie Cheung / 张丰毅 Fengyi Zha...', 'score': ['9.6']}
{'index': '3', 'image': 'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p1484728154.jpg', 'title': '阿甘正传', 'actor': '\n                            导演: 罗伯特·泽米吉斯 Robert Zemeckis\xa0\xa0\xa0主演: 汤姆·汉克斯 Tom Hanks / ...', 'score': ['9.5']}
{'index': '4', 'image': 'https://img3.doubanio.com/view/photo/s_ratio_poster/public/p511118051.jpg', 'title': '这个杀手不太冷', 'actor': '\n                            导演: 吕克·贝松 Luc Besson\xa0\xa0\xa0主演: 让·雷诺 Jean Reno / 娜塔莉·波特曼 ...', 'score': ['9.4']}
...

你可能感兴趣的:(#,编程语言,#,爪巴虫技术)