oicp5541 2023-02-22 21:55 采纳率: 57.1%
浏览 40
已结题

python爬虫,爬取的数据异常,如何解决?

python爬虫,爬取的数据异常,只提取了每一页的第一个内容

import requests
from lxml import etree


def get_data(page):
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,'
                            ' like Gecko) Chrome/109.0.0.0 Safari/537.36'}
    res = requests.get('https://ssr1.scrape.center/page/' + str(page), headers=header)
    return res.content


def html_data(respon):
    html = etree.HTML(respon)
    titles = html.xpath('//div[2]/a/h2/text()')
    liebies = html.xpath('//div/div/div[2]/div[1]/button/span/text()')
    pingfens = html.xpath('//div/div/div[3]/p[1]/text()')
    shijians = html.xpath('//div/div[2]/div[3]/span/text()')
    lianjies = html.xpath('//div/div/div[2]/a/@href')
    chandis = html.xpath('//div/div/div[2]/div[2]/*/text()')
    for title, liebie, pingfen, shijian, lianjie, \
            chandi in zip(titles, liebies, pingfens, shijians, lianjies, chandis):
        pingfen=pingfen.strip()
        return f'电影名:{title}\n剧情:{liebie}\n评分:{pingfen}\n上映时间:{shijian}\n发行地:{chandi}\n链接:https://ssr1.scrape.center{lianjie}\n=========================================\n'

def save_data(foods):
    f = open('foods.txt', 'a', encoding='utf-8')
    f.write(str(foods))
if __name__ == '__main__':
    for i in range(1, 11):
        page = i
        respon = get_data(page)
        foods = html_data(respon)
        html_data(respon)
        save_data(foods)
        print(f'---正在保存第{i}页---')


img

  • 写回答

3条回答 默认 最新

  • asgpt 2023-02-22 22:36
    关注

    这个问题在于html_data()函数中的return语句放在了for循环内部,这导致函数只能返回第一个电影的信息。把return语句缩进移动到for循环之外,这样才能返回整个页面的电影信息。
    另外,save_data()函数中也应该保存字符串而不是字典。

    
    ```python
    
    import requests
    from lxml import etree
    
    def get_data(page):
        header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,'
                                ' like Gecko) Chrome/109.0.0.0 Safari/537.36'}
        res = requests.get('https://ssr1.scrape.center/page/' + str(page), headers=header)
        return res.content
    
    def html_data(respon):
        html = etree.HTML(respon)
        titles = html.xpath('//div[2]/a/h2/text()')
        liebies = html.xpath('//div/div/div[2]/div[1]/button/span/text()')
        pingfens = html.xpath('//div/div/div[3]/p[1]/text()')
        shijians = html.xpath('//div/div[2]/div[3]/span/text()')
        lianjies = html.xpath('//div/div/div[2]/a/@href')
        chandis = html.xpath('//div/div/div[2]/div[2]/*/text()')
        result = ''
        for title, liebie, pingfen, shijian, lianjie, chandi in zip(titles, liebies, pingfens, shijians, lianjies, chandis):
            pingfen=pingfen.strip()
            result += f'电影名:{title}\n剧情:{liebie}\n评分:{pingfen}\n上映时间:{shijian}\n发行地:{chandi}\n链接:https://ssr1.scrape.center{lianjie}\n=========================================\n'
        return result
    
    def save_data(foods):
        f = open('foods.txt', 'a', encoding='utf-8')
        f.write(foods)
    
    if __name__ == '__main__':
        for i in range(1, 11):
            page = i
            respon = get_data(page)
            foods = html_data(respon)
            save_data(foods)
            print(f'---正在保存第{i}页---')
    
    

    在上述修改后的代码中,html_data()函数中使用result变量保存电影信息字符串,并在循环结束后返回该字符串。在save_data()函数中,将foods参数写入文件时,直接写入字符串即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月3日
  • 已采纳回答 2月23日
  • 修改了问题 2月22日
  • 创建了问题 2月22日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)