shenshuai 发表于 2020-5-30 11:54:15

Requests爬虫问题

大佬们,我现在要用Requests包去爬一个网址,这个网址需要登录密码之后才可以爬取。我现在已经完成了登录操作,但是我发现在爬取出来的数据是有问题的,我最需要的数据无法爬取出来,如下图所示:


这是我的代码:


想问一下大佬们该如何解决?

suchocolate 发表于 2020-5-30 19:37:19

你这不是提取出来了吗

Stubborn 发表于 2020-5-30 22:34:40

但是我发现在爬取出来的数据是有问题的,我最需要的数据无法爬取出来,如下图所示:


需要的数据请求不到?还是什么问题?最后打印的响应请求文本没有需要的数据??

suchocolate 发表于 2020-5-30 23:18:20

我最需要的数据无法爬取出来,如下图所示:
红框里不就是你最需要的数据吗,不然你标红框干嘛?

shenshuai 发表于 2020-5-31 00:25:52

suchocolate 发表于 2020-5-30 23:18
红框里不就是你最需要的数据吗,不然你标红框干嘛?

不是的,红框里显示告诉我,因为我的浏览器无法显示json数据,这是一段提示话。我真正需要的数据没有给我显示出来

kaohsing 发表于 2020-5-31 09:34:38

我猜是这样:用session登录,然后用session去请求真是的数据网址

suchocolate 发表于 2020-5-31 09:40:37

shenshuai 发表于 2020-5-31 00:25
不是的,红框里显示告诉我,因为我的浏览器无法显示json数据,这是一段提示话。我真正需要的数据没有给我 ...

headers调用试试

18307521742 发表于 2020-5-31 12:07:55

1、登录后把请求头“Referer”带上
2、好好分析你要的数据的响应体是访问的哪个url

nahongyan1997 发表于 2020-5-31 12:43:05

是.js文件还没有渲染出来,用selenium模块配合chromed driver加上谷歌浏览器就可以获取到渲染后的页面, 用switch_frame函数切换到你想要爬取的框架,就可以read到你想要获得的数据。

nahongyan1997 发表于 2020-5-31 12:45:40

# 此脚本需要配合谷歌浏览器与谷歌驱动
# 作者:那宏岩


import urllib.request
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def search(music=None,singer=None):
    if not music and not singer:
      raise ImportError('参数错误!!')
   
    if not music:
      name = singer
    else:
      name = music
   
    chrome_opt = Options()      # 创建参数设置对象.
    chrome_opt.add_argument('--headless')   # 无界面化.
#    chrome_opt.add_argument('--disable-gpu')    # 配合上面的无界面化.

    driver = webdriver.Chrome(chrome_options = chrome_opt,executable_path=r'C:\CLOUD Artification Intelligence\extanded_function\chromedriver.exe')
    driver.get('https://music.163.com/#/search/m/?s=' + name)
    driver.switch_to.frame('g_iframe')
    music_list = re.findall(r'<a href="/song\?id=(\d*)"><b title="(.*?)">',driver.page_source)
    singer_list = re.findall(r'<a href="/artist\?id=\d*">(.*?)</a>',driver.page_source)
    driver.quit()
    music_num = len(music_list)
    download_list = list()
    if singer:
      for i in range(music_num):
            if singer in singer_list:
                download_list.append(music_list+(singer_list,))
    else:
      for i in range(music_num):
            download_list.append(music_list+(singer_list,))
            
    print(download_list)
      
    down_load_sign = input(r'开始下载吗?:')
    if down_load_sign == 'Y':
      for each_music in download_list:
            print(f'{each_music}-{each_music}.mp3正在下载!')
            urllib.request.urlretrieve(f'http://music.163.com/song/media/outer/url?id={each_music}.mp3',f'C:\\CLOUD Artification Intelligence\\clouddata\\Sound\\{each_music}-{each_music}.mp3')
            print(f'{each_music}-{each_music}.mp3下载完成!')
      
            

if __name__ == '__main__':
    while True:
      music_name = input('请输入歌曲名:')
      singer_name = input('请输入歌手名:')
      search(music_name,singer_name)

nahongyan1997 发表于 2020-5-31 12:47:46

你可以看看我这个代码,本来是一个爬取网易云音乐的代码,里面包含了selenium的用法。改一改就可以在你的程序里使用了。

nahongyan1997 发表于 2020-5-31 12:49:05

# 此脚本需要配合谷歌浏览器与谷歌驱动
# 作者:那宏岩


import urllib.request
import re
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def search(music=None,singer=None):
    if not music and not singer:
      raise ImportError('参数错误!!')
   
    if not music:
      name = singer
    else:
      name = music
   
    chrome_opt = Options()      # 创建参数设置对象.
    chrome_opt.add_argument('--headless')   # 无界面化.
#    chrome_opt.add_argument('--disable-gpu')    # 配合上面的无界面化.

    driver = webdriver.Chrome(chrome_options = chrome_opt,executable_path=r'C:\CLOUD Artification Intelligence\extanded_function\chromedriver.exe')
    driver.get('https://music.163.com/#/search/m/?s=' + name)
    driver.switch_to.frame('g_iframe')
    music_list = re.findall(r'<a href="/song\?id=(\d*)"><b title="(.*?)">',driver.page_source)
    singer_list = re.findall(r'<a href="/artist\?id=\d*">(.*?)</a>',driver.page_source)
    driver.quit()
    music_num = len(music_list)
    download_list = list()
    if singer:
      for i in range(music_num):
            if singer in singer_list:
                download_list.append(music_list+(singer_list,))
    else:
      for i in range(music_num):
            download_list.append(music_list+(singer_list,))
            
    print(download_list)
      
    down_load_sign = input(r'开始下载吗?:')
    if down_load_sign == 'Y':
      for each_music in download_list:
            print(f'{each_music}-{each_music}.mp3正在下载!')
            urllib.request.urlretrieve(f'http://music.163.com/song/media/outer/url?id={each_music}.mp3',f'C:\\CLOUD Artification Intelligence\\clouddata\\Sound\\{each_music}-{each_music}.mp3')
            print(f'{each_music}-{each_music}.mp3下载完成!')
      
            

if __name__ == '__main__':
    while True:
      music_name = input('请输入歌曲名:')
      singer_name = input('请输入歌手名:')
      search(music_name,singer_name)

shenshuai 发表于 2020-6-1 01:55:10

nahongyan1997 发表于 2020-5-31 12:49


好的,我看看哈

xiaosi4081 发表于 2020-6-1 16:27:30

用selenium不香吗?

shenshuai 发表于 2020-6-1 16:55:15

xiaosi4081 发表于 2020-6-1 16:27
用selenium不香吗?

不方便,我有上千个网页要爬,每个都要跟手动模式一样打开网页再点半天,肯定是不行的。要不然就是什么无头浏览器,那个写起来过于麻烦

均昊山 发表于 2020-6-1 18:15:31

hearers 加下cookie 看看,或者私信QQ,帮你瞅瞅

陈尚涵 发表于 2020-7-24 14:24:58

shenshuai 发表于 2020-6-1 16:55
不方便,我有上千个网页要爬,每个都要跟手动模式一样打开网页再点半天,肯定是不行的。要不然就是什么无 ...

这可是个大数据啊
页: [1]
查看完整版本: Requests爬虫问题