鱼C论坛

 找回密码
 立即注册
查看: 1761|回复: 18

[已解决]用Requests取网页元素的问题,网页上能看到内容,但实际没有爬到数据

[复制链接]
发表于 2019-4-8 11:10:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 efeng8411676 于 2019-4-8 11:55 编辑

见附图,网页上能看到数字,用Requests爬取打印的内容中又没有,这种元素要怎么爬呢
                <div class="layui-form">
                    <table class="layui-table" id="ppchat-opens">
                        <thead>
                        <tr>
                            <th>期号</th>
                            <th>开奖号码</th>
                        </tr>
                        </thead>
                        <tbody>
                        </tbody>
                    </table>
                </div>
最佳答案
2019-4-8 13:57:30
F12看到的动态加载过后的,你需要右击然后查看源码,那采集是你requests获取到的源码,你看看如果源码里没有数据,那就看看是在那个接口加载进来的,直接获取接口的数据
QQ图片20190408105955.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-8 11:58:22 | 显示全部楼层
What?
爬这玩意干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-8 12:53:14 | 显示全部楼层
挣点外块啊。  能不能指点下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 13:56:47 | 显示全部楼层
xpath取不到吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 13:57:30 | 显示全部楼层    本楼为最佳答案   
F12看到的动态加载过后的,你需要右击然后查看源码,那采集是你requests获取到的源码,你看看如果源码里没有数据,那就看看是在那个接口加载进来的,直接获取接口的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-8 14:12:22 | 显示全部楼层
1239890175 发表于 2019-4-8 13:57
F12看到的动态加载过后的,你需要右击然后查看源码,那采集是你requests获取到的源码,你看看如果源码里没 ...

右键看源码里没有,接口怎么用,能不能说详细点,刚学会用Reuests
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 14:14:52 | 显示全部楼层
efeng8411676 发表于 2019-4-8 14:12
右键看源码里没有,接口怎么用,能不能说详细点,刚学会用Reuests

谷歌浏览器Network 自行 百度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 14:28:02 | 显示全部楼层
打开有的话,可以直接.get()获取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-8 14:56:21 | 显示全部楼层
minjun 发表于 2019-4-8 14:28
打开有的话,可以直接.get()获取

打开有?   右键看源代码没有,.get()是什么的方法,新手。  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-8 19:31:11 | 显示全部楼层
用beautifulsoup取出get到的text,然后直接用正则表达式库:re里的match方法搜索'<span class="n*">*</span>',一边搜索一边截取,最后每5个数字一截取就能得到每组数字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-9 11:39:46 | 显示全部楼层
目标数据属于动态加载数据,自行百度如何爬取动态加载的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-9 13:07:52 | 显示全部楼层
换一个容易爬的网站
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-9 19:46:04 | 显示全部楼层
用json搞定了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-12 15:11:57 | 显示全部楼层

说一下JSON到底怎么找的,每次找都觉得头大,最后都只能用SPLASH解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-14 11:36:16 | 显示全部楼层
wiselin 发表于 2019-4-12 15:11
说一下JSON到底怎么找的,每次找都觉得头大,最后都只能用SPLASH解决

引入两个包
from urllib.parse import urlencode
import json

看下对应网页json数据的结构,发送对应的请求取page和plan。   你的方法也发来学习学习

def get_page():
    """
        根据偏移量获取网页
    """
    global headers
    # url请求参数
    params = {'code':'pk10',
              'plan':'0',
              'size':'20',
              'planSize':'20'
             }
    # 拼接url
    url = base_url + urlencode(params)

    # 请求url
    response = requests.get(url, headers=headers)
    return response.text


def get_plan(json_text):
    """
        从json类型的文字中计划
    """
    jt = json.loads(json_text)
    title=jt['data']['planName']
    #获取计划
    data1=jt['data']['plan']
    if data1:
        for item in data1:
            if item['plans'] is None: #
                continue
            beginIssue = item['beginIssue']
            endIssue = item['endIssue']
            plans = item['plans']
            if item.__contains__('win'):
                win = item['win']
            else:
                win='null'
            winIssue=item['winIssue']
            yield {
                    'title': title,
                    'bggin': beginIssue,
                    '-end': endIssue,
                    'plan':plans,
                    #'win':win,
                    'win':winIssue
                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-14 11:40:20 | 显示全部楼层
回楼上wiselin的,参考网页json内容的结构,发送请求获取page和plan。   你用SPLASH的方法也发来看看学习学习
def get_page():
    """
        根据偏移量获取网页
    """
    global headers
    # url请求参数
    params = {'code':'pk10',
              'plan':'0',
              'size':'20',
              'planSize':'20'
             }
    # 拼接url
    url = base_url + urlencode(params)

    # 请求url
    response = requests.get(url, headers=headers)
    return response.text

def get_plan(json_text):
    """
        从json类型的文字中计划
    """
    jt = json.loads(json_text)
    title=jt['data']['planName']
    #获取计划
    data1=jt['data']['plan']
    if data1:
        for item in data1:
            if item['plans'] is None: #
                continue
            beginIssue = item['beginIssue']
            endIssue = item['endIssue']
            plans = item['plans']
            if item.__contains__('win'):
                win = item['win']
            else:
                win='null'
            winIssue=item['winIssue']
            yield {
                    'title': title,
                    'bggin': beginIssue,
                    '-end': endIssue,
                    'plan':plans,
                    #'win':win,
                    'win':winIssue
                }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-15 09:28:08 | 显示全部楼层
efeng8411676 发表于 2019-4-14 11:40
回楼上wiselin的,参考网页json内容的结构,发送请求获取page和plan。   你用SPLASH的方法也发来看看学习学 ...

因为你没发网址,所以没看出来是哪个网,但看数据应该是SS彩之类的,我就以500.com采集排列5数据为例说一下用splash把数据爬下来
1.首先是安装scrapy,教程网上很多的,然后是docker跟splash,教程论坛这里有,一步步做就是了,不用弄得很明白
https://fishc.com.cn/forum.php?m ... mp;highlight=splash
2.然后运行DOCKER
输入docker run -p 8050:8050 scrapinghub/splash
输入http://192.168.99.100:8050测试,如果能打开就是运行成功了
3.在你的项目文件夹下的setting.py添加如下代码:
  1. # 渲染服务的url
  2. SPLASH_URL='http://192.168.99.100:8050'
  3. #下载器中间件
  4. DOWNLOADER_MIDDLEWARES = {
  5.         'scrapy_splash.SplashCookiesMiddleware':723,
  6.         'scrapy_splash.SplashMiddleware':725,
  7.         'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware':800
  8. }

  9. SPIDER_MIDDLEWARES ={
  10.         'scrapy_splash.SplashDeduplicateArgsMiddleware':100
  11. }
  12. # 去重过滤器
  13. DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

  14. # 使用Splash的Http缓存
  15. HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
复制代码

4.用爬虫提取数据
  1. class Num5Spider(scrapy.Spider):
  2.     name = 'num5'
  3.     allowed_domains = ['www.500.com']
  4.    

  5.     def start_requests(self):
  6.                   'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'}
  7.         urls = ['http://datachart.500.com/plw/zoushi/xjm.shtml?expect=all&from=16001&to=19091']
  8.         for url in urls:
  9.             yield SplashRequest(url=url,callback=self.parse)
  10.             
  11.     def parse(self, response):
  12.         wb = op.load_workbook(r"D:\排列5.xlsx")
  13.         ws = wb.get_sheet_by_name('Sheet1')
  14.         count =0
  15.         for text in response.xpath('//*[@id="chartsTable"]/tbody//tr/td[2]/text()').extract():
  16.             count+=1
  17.             ws["A%d"%count].value = text
  18.         count =0
  19.         for text2 in response.xpath('//*[@id="chartsTable"]/tbody//tr/td[3]/text()').extract():
  20.             count+=1
  21.             ws["B%d"%count].value = text2
  22.         count =0
  23.         for text3 in response.xpath('//*[@id="chartsTable"]/tbody//tr/td[4]/text()').extract():
  24.             count+=1
  25.             ws["C%d"%count].value = text3
  26.         count =0
  27.         for text4 in response.xpath('//*[@id="chartsTable"]/tbody//tr/td[5]/text()').extract():
  28.             count+=1
  29.             ws["D%d"%count].value = text4
  30.         count =0
  31.         for text5 in response.xpath('//*[@id="chartsTable"]/tbody//tr/td[6]/text()').extract():
  32.             count+=1
  33.             ws["E%d"%count].value = text5
  34.         wb.save("D:\排列5.xlsx")
复制代码

最后说一句,别玩这种高频彩,很容易被坑死
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-15 12:30:52 | 显示全部楼层
wiselin 发表于 2019-4-15 09:28
因为你没发网址,所以没看出来是哪个网,但看数据应该是SS彩之类的,我就以500.com采集排列5数据为例说一 ...

你这个确实麻烦些。
谢谢提醒,跟着别人用小钱测测逻辑。 你爬这个是学习还是?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-15 15:06:59 | 显示全部楼层
efeng8411676 发表于 2019-4-15 12:30
你这个确实麻烦些。
谢谢提醒,跟着别人用小钱测测逻辑。 你爬这个是学习还是?

纯研究,这方法麻烦在于第一次安装,后面的话省却了找目标网页的工夫,效率还是很高的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 09:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表